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

Java注解Annotation的使用詳解

 更新時間:2025年09月17日 09:46:01   作者:Stewie Lee  
文章介紹了Java注解的基本概念、定義使用方法、元注解(如@Retention、@Target)的作用及內(nèi)置注解(@Override、@Deprecated、@SuppressWarnings)的功能與應用場景,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

一、注解簡介

1、注解是什么

Java 的注解(Annotation)是一種特殊的語法,用于在代碼中添加元數(shù)據(jù)(Metadata)。

2、注解有什么用

注解本身并不是代碼的一部分,它們不會直接影響代碼的執(zhí)行,但可以在編譯、類加載和運行時被讀取和處理。注解為開發(fā)者提供了一種以非侵入性的方式為代碼提供額外信息的手段。

二、注解的定義與使用

1、注解的定義

1)基本語法

注解是使用 @interface 關(guān)鍵字定義的,并且默認繼承自 Annotation 接口?;镜恼Z法如下:

public @interface MyAnnotation {
    String value() default "";
    int count();
}

2)注解的屬性

    String value() default "";
    int count();

這兩個都是注解的屬性,它們是以這種抽象方法的格式定義的,這樣可以支持更多類型,因為方法的返回類型比字段可以定義的類型多:

public @interface MyAnnotation {
    // 方法返回Class類型
    Class<?> classType() default Object.class;
    // 方法返回注解類型
    MyAnnotation nestedAnnotation() default @MyAnnotation;
}

3)默認值

可以使用 default 關(guān)鍵字為注解的屬性添加默認值,這樣在使用注解時,可以不為這一項傳入屬性值。

如果一個屬性沒有默認值,則在使用時必須傳入屬性值。

2、注解的使用

1)基本語法

注解可以用在類、方法、字段、參數(shù)等多種地方。例如:

class SuperClass {
	public void foo() {
		System.out.println("SuperClass~");
	}
}
class SubClass extends SuperClass {
	@Override
	public void foo() {
		System.out.println("SubClass~");
	}
}

2)有屬性的注解的使用

如果一個注解有屬性,而且這個屬性有默認值,則可以不傳入屬性值,這時屬性值為默認值:

@interface MyAnnotation {
	int attribute() default 0;
}
@MyAnnotation()
class Sample {
}

如果這個屬性沒有默認值,則在使用注解時就需要傳入屬性值:

@interface MyAnnotation {
	int attribute();
}
@MyAnnotation(attribute = 0)
class Sample {
}

而且這里必須使用 屬性名 = 屬性值 的格式傳值。

如果有多個屬性,傳值也是類似的:

@interface MyAnnotation {
	int attribute1();
	int attribute2();
}
@MyAnnotation(attribute1 = 1, attribute2 = 2)
class Sample {
}

3)屬性名為 value

當一個注解中只有一個屬性時,如果這個屬性被命名為 value,則在使用該注解時可以省略屬性名稱。這是為了提高代碼的簡潔性和易讀性。

@interface MyAnnotation {
	int value();
}
@MyAnnotation(1)
class Sample {
}

如果只有一個屬性,屬性名不是 value 的話,這樣寫就會報錯:

@interface MyAnnotation {
	int attribute();
}
@MyAnnotation(1) // 這里會報錯,必須寫成 @MyAnnotation(attribute = 1)
class Sample {
}

如果有多個屬性,屬性中有 value 這個屬性的話,也需要按 屬性名 = 屬性值 的格式指明每一個屬性的屬性值:

@interface MyAnnotation {
	int value();
	int attribute();
}
@MyAnnotation(value = 1, attribute = 1)
class Sample {
}

三、元注解

元注解是用來修飾注解的注解。

1、@Retention

@Retention 注解定義了一個注解的生命周期,即該注解在哪個階段可用。

1)屬性可取值

  • RetentionPolicy.SOURCE:注解僅在源代碼中存在,編譯器使用后就會丟棄它,在編譯后不會保留。
  • RetentionPolicy.CLASS:注解在編譯后仍然存在于類文件中,但在運行時虛擬機不保留注解。
  • RetentionPolicy.RUNTIME:注解在運行時仍然可用,運行時虛擬機會保留注解,可以通過反射讀取。

對于 @Retention 的元素的默認值是 RetentionPolicy.CLASS。

2)源代碼

我們可以查看 @Retention 的源代碼:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

對于:

@Documented

表明 @Retention 元注解會保留在 Javadoc 中。

對于:

@Retention(RetentionPolicy.RUNTIME)

表示 @Retention 會在運行時保留。

對于:

@Target(ElementType.ANNOTATION_TYPE)

表示 @Retention 只能修飾注解類型。

 可以看到 @Retention 的唯一一個屬性的類型是 RetentionPolicy 類型,這個類型也是一個枚舉類型,它的源碼是:

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

3)示例

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

可以看到對于 @Override 是只在源碼中保留的。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

對于 @Deprecated 是運行時也會保留的。

2、@Target

@Target 注解定義了一個注解可以應用于哪些 Java 元素。

1)屬性可取值

  • ElementType.TYPE:可以應用于類、接口、枚舉或注解。
  • ElementType.FIELD:可以應用于字段。
  • ElementType.METHOD:可以應用于方法。
  • ElementType.PARAMETER:可以應用于方法參數(shù)。
  • ElementType.CONSTRUCTOR:可以應用于構(gòu)造函數(shù)。
  • ElementType.LOCAL_VARIABLE:可以應用于局部變量。
  • ElementType.ANNOTATION_TYPE:可以應用于注解類型。
  • ElementType.PACKAGE:可以應用于包聲明。

2)源代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

對于:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)

第一行表示 @Target 元注解會保留在 Javadoc 中。第二行表示 @Target 注解會在運行時依然保留,最后一行表示 @Target 只能修飾注解類型。

對于 @Target 的屬性,是一個 ElementType 類型的數(shù)組,對于 ElementType 類型,也是一個枚舉類型:

public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

3)示例

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

可以看到,@Override 只能修飾方法類型。

3、@Documented

@Documented表明被它修飾的注解應該被包含在Java文檔中(如Javadoc)中。

1)源代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Documented 元注解沒有屬性,會在運行時保留,只能修飾注解類型,會被包含在 Javadoc 中。

2)示例

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

這里的代碼就說明 @Deprecated 注解會被包含在 Javadoc 中。

4、@Inherited

@Inherited 注解表明一個注解是可繼承的。這意味著如果一個類被標記為使用某個注解,那么它的子類可以自動獲得這個注解。

1)源代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

@Inherited 元注解沒有屬性,會在運行時保留,只能修飾注解類型,會被包含在 Javadoc 中。

四、Java 內(nèi)置注解

這里介紹三個基本的注解。

1、@Override

1)介紹

用于標識一個方法是重寫父類的方法。該注解只能用于方法。

例如:

class SuperClass {
	public void foo() {
		System.out.println("SuperClass's foo.");
	}
}
class SubClass extends SuperClass {
	@Override
	public void foo() {
		System.out.println("SubClass's foo");
	}
}

2)源代碼

我們可以查看 @Override 的源碼:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

可以看到在定義了 @Override 注解時,@Override 的定義前面還加了兩個元注解:

@Target(ElementType.METHOD)

這個元注解限制了 @Override 只能修飾方法。

@Retention(RetentionPolicy.SOURCE)

這個元注解限制了 @Override 只會在源代碼中存在,編譯后不再保留。

2、@Deprecated

1)介紹

表示某個元素(類、方法、字段等)已經(jīng)過時,不建議使用。仍然可以使用,但是不建議使用,通常是因為這個元素已經(jīng)被替換為較新的功能。

例如:

@Deprecated
class Sample {
	
}

在使用這個類時,會顯示:

可以看到這個類被線劃掉了,說明這個類已經(jīng)過時。

2)源代碼

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

這里的源代碼說明,@Deprecated 注解會包含在 Javadoc 中,會在運行時保留,可以修飾構(gòu)造器、字段、局部變量等類型

3、@SuppressWarnings

1)介紹

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

例如:

public class Example {
	public static void main(String[] args) {
		int i;
	}
}

當我們聲明了一個整型變量,而沒有使用它時,就會出現(xiàn)警告:

這時,我們就可以使用 @SuppressWarnings 抑制這個警告:

public class Example {
	@SuppressWarnings({"all"}) // 這個注解有屬性,所以需要傳入屬性值,all 代表忽略所有類型警告
	public static void main(String[] args) {
		int i;
	}
}

這樣,上面的警告就消失了。

2)源代碼

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

這里的源代碼說明,@SuppressWarnings 注解能修飾類、接口、注解、枚舉、字段等類型,只會在源代碼中保留。

3)屬性可取值

unchecked:

  • 抑制與未檢查的操作相關(guān)的警告,通常與泛型類型的使用有關(guān)。例如,在將原始類型賦值給泛型參數(shù)時可能會出現(xiàn)此警告。

deprecation:

  • 抑制關(guān)于使用已棄用(deprecated)API的警告。當使用的類或方法標記為過時時,編譯器會發(fā)出警告。

rawtypes:

  • 抑制與使用原始類型(raw types)相關(guān)的警告。當使用未指定類型參數(shù)的集合(如List而不是List<String>)時會出現(xiàn)此警告。

unused:

  • 抑制未使用的變量、方法或類的警告。這在開發(fā)過程中可能會使用,以避免對未使用代碼的警告。

fallthrough:

  • 抑制在switch語句中缺少break語句導致的警告。

對于 @SuppressWarning 的 value 屬性,可取值比較多,上面只是一部分。

到此這篇關(guān)于Java注解Annotation的文章就介紹到這了,更多相關(guān)Java 注解 Annotation內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

康马县| 上犹县| 博兴县| 黄浦区| 轮台县| 抚松县| 林西县| 黄山市| 杭州市| 锡林郭勒盟| 新丰县| 长阳| 广水市| 平陆县| 秦安县| 安远县| 嘉峪关市| 杭锦旗| 陇南市| 拉孜县| 中山市| 招远市| 滦南县| 久治县| 合水县| 山东省| 阿坝县| 封开县| 阳泉市| 上栗县| 东乡族自治县| 石渠县| 黔西县| 隆化县| 大同市| 邵阳市| 肃南| 宜兰县| 青阳县| 和林格尔县| 绥阳县|