最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java注解(Annotations)的定義和使用詳解

 更新時(shí)間:2025年03月11日 09:08:10   作者:冰糖心書房  
Java注解(Annotations)是Java5引入的一種元數(shù)據(jù)(Metadata),它提供了一種在源代碼中嵌入補(bǔ)充信息的方式,這些信息可以被編譯器、JVM或其他工具在編譯時(shí)、運(yùn)行時(shí)進(jìn)行處理,注解本身不會直接影響程序的執(zhí)行,但可以用來指導(dǎo)編譯器、JVM或其他工具的行為,從而實(shí)現(xiàn)各種功能

Java 注解(Annotations)是 Java 5 引入的一種元數(shù)據(jù)(Metadata),它提供了一種在源代碼中嵌入補(bǔ)充信息的方式,這些信息可以被編譯器、JVM 或其他工具在編譯時(shí)、運(yùn)行時(shí)進(jìn)行處理。

注解本身不會直接影響程序的執(zhí)行,但可以用來指導(dǎo)編譯器、JVM 或其他工具的行為,從而實(shí)現(xiàn)各種功能。

一、 注解的定義 (Annotation Definition)

什么是元數(shù)據(jù) (Metadata)?

  • 元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)。 在 Java 中,元數(shù)據(jù)是指描述程序代碼的數(shù)據(jù),例如類、方法、字段等的屬性信息。
  • 注解就是一種元數(shù)據(jù),它可以用來描述類、方法、字段、參數(shù)、局部變量等程序元素。

注解的語法

@Retention(RetentionPolicy.RUNTIME) // 元注解,指定注解的保留策略
@Target({ElementType.METHOD, ElementType.TYPE}) // 元注解,指定注解可以應(yīng)用的程序元素類型
public @interface MyAnnotation { // 定義一個(gè)注解

    // 注解成員 (Annotation Members)
    String name() default "Default Name"; // 默認(rèn)值
    int value(); // 必須賦值

    Class<?> type() default void.class; //類型
}
  • @interface 關(guān)鍵字: 用于定義一個(gè)注解。
  • 注解名 (Annotation Name): 遵循 PascalCase 命名規(guī)范(每個(gè)單詞首字母大寫),例如 Override, Deprecated, WebServlet。
  • 注解成員 (Annotation Members):
    • 類似于接口中的方法聲明,但沒有方法體。
    • 可以有默認(rèn)值 (使用 default 關(guān)鍵字指定)。
    • 如果沒有默認(rèn)值,則在使用注解時(shí)必須顯式賦值。
    • 成員的類型可以是原始類型、StringClass、枚舉類型、注解類型或這些類型的數(shù)組。
    • 注解成員實(shí)際上類似于接口中的方法,這意味著它們可以有訪問修飾符,但通常省略 (默認(rèn)是 public)。
    • 注解成員后面要跟一對小括號,即使沒有參數(shù)。

二、元注解 (Meta-Annotations)

元注解是用于修飾注解的注解,用于指定注解的特性。

1.@Retention

作用: 指定注解的保留策略 (Retention Policy),即注解在哪個(gè)階段可用。

RetentionPolicy 枚舉:

  • RetentionPolicy.SOURCE: 注解僅保留在源代碼中,在編譯時(shí)被丟棄。 例如,@Override 注解。
  • RetentionPolicy.CLASS: 注解保留在 class 文件中,但在運(yùn)行時(shí)會被 JVM 丟棄。
  • RetentionPolicy.RUNTIME: 注解保留在 class 文件中,并且在運(yùn)行時(shí)可以通過反射 API 獲取。 這是最常用的保留策略,可以實(shí)現(xiàn)各種動態(tài)功能。

示例:

@Retention(RetentionPolicy.RUNTIME) // 指定注解在運(yùn)行時(shí)可用
public @interface MyAnnotation {
    // ...
}

2.@Target

作用: 指定注解可以應(yīng)用的程序元素類型 (Target Element)。

ElementType 枚舉:

  • ElementType.TYPE: 可以應(yīng)用于類、接口、枚舉、注解。
  • ElementType.FIELD: 可以應(yīng)用于字段。
  • ElementType.METHOD: 可以應(yīng)用于方法。
  • ElementType.PARAMETER: 可以應(yīng)用于方法參數(shù)。
  • ElementType.CONSTRUCTOR: 可以應(yīng)用于構(gòu)造方法。
  • ElementType.LOCAL_VARIABLE: 可以應(yīng)用于局部變量。
  • ElementType.ANNOTATION_TYPE: 可以應(yīng)用于注解。
  • ElementType.PACKAGE: 可以應(yīng)用于包。
  • ElementType.TYPE_PARAMETER: 類型參數(shù),since 1.8
  • ElementType.TYPE_USE: 使用類型的任何地方, since 1.8

示例:

@Target({ElementType.METHOD, ElementType.TYPE}) // 指定注解可以應(yīng)用于方法和類
public @interface MyAnnotation {
    // ...
}

1.@Documented

作用: 指定該注解應(yīng)該包含在 Javadoc 文檔中。

示例:

@Documented // 指定該注解應(yīng)該包含在 Javadoc 文檔中
public @interface MyAnnotation {
    // ...
}

2.@Inherited

作用: 指定該注解可以被子類繼承。

示例:

@Inherited // 指定該注解可以被子類繼承
public @interface MyAnnotation {
    // ...
}

3.@Repeatable (Java 8+):

作用: 指定該注解可以在同一個(gè)程序元素上重復(fù)使用。

示例:

@Repeatable(Authorities.class)
public @interface Authority {
    String role();
}

public @interface Authorities {
    Authority[] value();
}

@Authority(role="Admin")
@Authority(role="Editor")
public class MyClass {
    // ...
}

三、內(nèi)置注解 (Built-in Annotations)

Java 提供了一些內(nèi)置注解,可以直接使用:

1.@Override

作用: 用于標(biāo)記一個(gè)方法是重寫 (Override) 了父類的方法。

用途:

  • 幫助編譯器檢查是否正確地重寫了方法。 如果方法簽名與父類方法不匹配,編譯器會報(bào)錯(cuò)。
  • 提高代碼可讀性,明確表明該方法是重寫了父類的方法。

示例:

class Animal {
    void eat() {
        System.out.println("Animal is eating.");
    }
}

class Dog extends Animal {
    @Override // 標(biāo)記該方法重寫了父類的 eat() 方法
    void eat() {
        System.out.println("Dog is eating.");
    }
}

2.@Deprecated

作用: 用于標(biāo)記一個(gè)類、方法或字段已過時(shí) (Deprecated),不建議使用。

用途:

  • 提醒開發(fā)者該類、方法或字段已經(jīng)不推薦使用,可能會在將來的版本中被移除。
  • 可以提供替代方案的說明。

示例:

@Deprecated // 標(biāo)記該方法已過時(shí)
public void oldMethod() {
    // ...
}

/**
 * @deprecated Use {@link #newMethod()} instead.
 */
@Deprecated
public void oldMethodWithComment(){
    //...
}

public void newMethod() {
    // ...
}

3.@SuppressWarnings

作用: 用于抑制編譯器發(fā)出的警告。

用途:

  • 在某些情況下,編譯器可能會發(fā)出一些不必要的警告,可以使用 @SuppressWarnings 注解來抑制這些警告。

取值:

  • all: 抑制所有警告。
  • boxing: 抑制與自動裝箱/拆箱相關(guān)的警告。
  • deprecation: 抑制與使用了 @Deprecated 標(biāo)記的類、方法或字段相關(guān)的警告。
  • unchecked: 抑制與未檢查的類型轉(zhuǎn)換相關(guān)的警告(例如,在使用原始類型時(shí))。
  • unused: 抑制與未使用的變量相關(guān)的警告。
  • resource: 抑制與資源未關(guān)閉相關(guān)的警告。
  • 等等 (具體取決于編譯器)。

示例:

@SuppressWarnings("unchecked") // 抑制類型轉(zhuǎn)換警告
List list = new ArrayList();
list.add("Hello");
String s = (String) list.get(0); // 編譯器會發(fā)出 unchecked 類型轉(zhuǎn)換警告

四、自定義注解 (Custom Annotations)

除了內(nèi)置注解,你還可以根據(jù)自己的需求創(chuàng)建自定義注解。

定義注解:

  • 使用 @interface 關(guān)鍵字定義注解。
  • 指定元注解 (@Retention, @Target 等)。
  • 定義注解成員。

使用注解:

  • 在程序元素(類、方法、字段等)上使用自定義注解,并為注解成員賦值(如果需要)。

處理注解 (Annotation Processing):

  • 編譯時(shí)處理: 可以使用注解處理器 (Annotation Processor) 在編譯時(shí)處理注解,生成代碼或配置文件。 例如,Lombok 使用注解處理器自動生成 getter/setter 方法。
  • 運(yùn)行時(shí)處理: 可以使用反射 API 在運(yùn)行時(shí)獲取注解信息,并根據(jù)注解信息執(zhí)行相應(yīng)的邏輯。

五、使用場景 (Annotation Usage Scenarios)

注解在 Java 中有著廣泛的應(yīng)用,主要包括以下場景:

編譯時(shí)檢查:

  • 使用 @Override 注解進(jìn)行方法重寫檢查。
  • 使用 @SuppressWarnings 注解抑制編譯器警告。

代碼生成:

  • Lombok 使用注解處理器自動生成 getter/setter 方法、構(gòu)造方法、equals()/hashCode() 方法等,簡化代碼編寫。
  • JPA 使用注解來映射類和數(shù)據(jù)庫表,生成 SQL 語句。
  • Spring MVC 使用注解來映射請求 URL 和處理方法。

配置:

  • Spring 使用注解來配置 Bean、依賴注入、事務(wù)管理、AOP 等。
  • JAX-RS 使用注解來定義 RESTful Web 服務(wù)。

運(yùn)行時(shí)行為修改:

  • 單元測試框架 (例如 JUnit, TestNG) 使用注解來標(biāo)記測試方法。
  • 安全框架 (例如 Spring Security) 使用注解來進(jìn)行權(quán)限控制。
  • 序列化框架 (例如 Jackson, Gson) 使用注解來控制序列化和反序列化過程。

六、代碼示例 (自定義注解)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME) // 指定注解在運(yùn)行時(shí)可用
@Target(ElementType.METHOD) // 指定注解可以應(yīng)用于方法
public @interface MyAnnotation { // 定義一個(gè)自定義注解

    String name() default "Default Name"; // 成員變量,默認(rèn)值Default Name
    int value();   // 成員變量

}

class MyClass {

    @MyAnnotation(name = "My Method", value = 100) // 使用注解并賦值
    public void myMethod() {
        System.out.println("My method is called.");
    }
}

public class AnnotationExample {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;
        Method method = clazz.getMethod("myMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) { // 判斷方法是否使用了 MyAnnotation 注解
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); // 獲取注解對象

            System.out.println("Annotation name: " + annotation.name()); // 獲取 name 成員的值
            System.out.println("Annotation value: " + annotation.value()); // 獲取 value 成員的值
        }
    }
}

總結(jié)

Java 注解是一種強(qiáng)大的元數(shù)據(jù)機(jī)制,它可以在代碼中嵌入補(bǔ)充信息,并在編譯時(shí)或運(yùn)行時(shí)被處理。 理解注解的定義、元注解、內(nèi)置注解、自定義注解以及使用場景,可以幫助你編寫更簡潔、更靈活、更易于維護(hù)的 Java 代碼。 掌握注解,能讓你更深入地理解各種框架和庫的運(yùn)作方式,并能夠自定義 Spring Boot Starter等功能.

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot 枚舉類型的自動轉(zhuǎn)換的實(shí)現(xiàn)

    SpringBoot 枚舉類型的自動轉(zhuǎn)換的實(shí)現(xiàn)

    一般我們在數(shù)據(jù)庫都會定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動轉(zhuǎn)換,感興趣的可以了解一下
    2022-03-03
  • Java加解密技術(shù)系列之RSA詳解

    Java加解密技術(shù)系列之RSA詳解

    出于安全考慮,網(wǎng)絡(luò)的傳輸中經(jīng)常對傳輸數(shù)據(jù)做加密和編碼處理,本篇文章主要介紹Java加解密技術(shù)系列之RSA詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-10-10
  • 使用MAT進(jìn)行JVM內(nèi)存分析實(shí)例

    使用MAT進(jìn)行JVM內(nèi)存分析實(shí)例

    這篇文章主要介紹了使用MAT進(jìn)行JVM內(nèi)存分析實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MybatisGenerator文件生成不出對應(yīng)文件的問題

    MybatisGenerator文件生成不出對應(yīng)文件的問題

    本文介紹了使用MybatisGenerator生成文件時(shí)遇到的問題及解決方法,主要步驟包括檢查目標(biāo)表是否存在、是否能連接到數(shù)據(jù)庫、配置生成器的路徑等,通過在項(xiàng)目結(jié)構(gòu)中引入相應(yīng)的jar包,并在GeneratorSqlmap.java文件中運(yùn)行,可以成功生成對應(yīng)的文件
    2025-01-01
  • 詳解Java 中泛型的實(shí)現(xiàn)原理

    詳解Java 中泛型的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解Java 中泛型的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot中配置文件及切換方式

    SpringBoot中配置文件及切換方式

    這篇文章主要介紹了SpringBoot中配置文件及切換方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解java 拼音首字母搜索內(nèi)容功能的示例

    詳解java 拼音首字母搜索內(nèi)容功能的示例

    這篇文章主要介紹了詳解java 拼音首字母搜索內(nèi)容功能的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式

    SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式

    這篇文章主要介紹了SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于Java實(shí)現(xiàn)Socket編程入門

    基于Java實(shí)現(xiàn)Socket編程入門

    Java最初是作為網(wǎng)絡(luò)編程語言出現(xiàn)的,使得客戶端和服務(wù)器的溝通變成了現(xiàn)實(shí),而在網(wǎng)絡(luò)編程中,使用最多的就是Socket,本文就來介紹一下基于Java實(shí)現(xiàn)Socket編程入門,感興趣的可以來了解一下
    2022-03-03
  • 淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中

    淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中

    在現(xiàn)代軟件開發(fā)中,Docker已成為一種流行的容器化技術(shù),能夠簡化應(yīng)用的部署和管理,本文將詳細(xì)介紹如何將多個(gè)Spring Boot項(xiàng)目打包到一個(gè)Docker容器中,希望對大家有所幫助
    2024-10-10

最新評論

秭归县| 恩施市| 广丰县| 新龙县| 芒康县| 台北县| 昔阳县| 黄骅市| 大名县| 鹤庆县| 武宣县| 随州市| 巴里| 余江县| 阜阳市| 南昌市| 廊坊市| 子洲县| 日喀则市| 锦屏县| 湘阴县| 正阳县| 资源县| 绥中县| 普兰县| 仁怀市| 东阳市| 布尔津县| 禄丰县| 临清市| 牡丹江市| 武山县| 彩票| 茂名市| 宣化县| 芜湖市| 天气| 汝城县| 全椒县| 咸丰县| 镇雄县|