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

Java注解Annotation的使用詳解

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

一、注解簡(jiǎn)介

1、注解是什么

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

2、注解有什么用

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

二、注解的定義與使用

1、注解的定義

1)基本語法

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

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

2)注解的屬性

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

這兩個(gè)都是注解的屬性,它們是以這種抽象方法的格式定義的,這樣可以支持更多類型,因?yàn)榉椒ǖ姆祷仡愋捅茸侄慰梢远x的類型多:

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

3)默認(rèn)值

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

如果一個(gè)屬性沒有默認(rèn)值,則在使用時(shí)必須傳入屬性值。

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)有屬性的注解的使用

如果一個(gè)注解有屬性,而且這個(gè)屬性有默認(rèn)值,則可以不傳入屬性值,這時(shí)屬性值為默認(rèn)值:

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

如果這個(gè)屬性沒有默認(rèn)值,則在使用注解時(shí)就需要傳入屬性值:

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

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

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

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

3)屬性名為 value

當(dāng)一個(gè)注解中只有一個(gè)屬性時(shí),如果這個(gè)屬性被命名為 value,則在使用該注解時(shí)可以省略屬性名稱。這是為了提高代碼的簡(jiǎn)潔性和易讀性。

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

如果只有一個(gè)屬性,屬性名不是 value 的話,這樣寫就會(huì)報(bào)錯(cuò):

@interface MyAnnotation {
	int attribute();
}
@MyAnnotation(1) // 這里會(huì)報(bào)錯(cuò),必須寫成 @MyAnnotation(attribute = 1)
class Sample {
}

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

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

三、元注解

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

1、@Retention

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

1)屬性可取值

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

對(duì)于 @Retention 的元素的默認(rèn)值是 RetentionPolicy.CLASS。

2)源代碼

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

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

對(duì)于:

@Documented

表明 @Retention 元注解會(huì)保留在 Javadoc 中。

對(duì)于:

@Retention(RetentionPolicy.RUNTIME)

表示 @Retention 會(huì)在運(yùn)行時(shí)保留。

對(duì)于:

@Target(ElementType.ANNOTATION_TYPE)

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

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

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

3)示例

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

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

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

對(duì)于 @Deprecated 是運(yùn)行時(shí)也會(huì)保留的。

2、@Target

@Target 注解定義了一個(gè)注解可以應(yīng)用于哪些 Java 元素。

1)屬性可取值

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

2)源代碼

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

對(duì)于:

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

第一行表示 @Target 元注解會(huì)保留在 Javadoc 中。第二行表示 @Target 注解會(huì)在運(yùn)行時(shí)依然保留,最后一行表示 @Target 只能修飾注解類型。

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

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表明被它修飾的注解應(yīng)該被包含在Java文檔中(如Javadoc)中。

1)源代碼

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

@Documented 元注解沒有屬性,會(huì)在運(yùn)行時(shí)保留,只能修飾注解類型,會(huì)被包含在 Javadoc 中。

2)示例

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

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

4、@Inherited

@Inherited 注解表明一個(gè)注解是可繼承的。這意味著如果一個(gè)類被標(biāo)記為使用某個(gè)注解,那么它的子類可以自動(dòng)獲得這個(gè)注解。

1)源代碼

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

@Inherited 元注解沒有屬性,會(huì)在運(yùn)行時(shí)保留,只能修飾注解類型,會(huì)被包含在 Javadoc 中。

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

這里介紹三個(gè)基本的注解。

1、@Override

1)介紹

用于標(biāo)識(shí)一個(gè)方法是重寫父類的方法。該注解只能用于方法。

例如:

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 注解時(shí),@Override 的定義前面還加了兩個(gè)元注解:

@Target(ElementType.METHOD)

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

@Retention(RetentionPolicy.SOURCE)

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

2、@Deprecated

1)介紹

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

例如:

@Deprecated
class Sample {
	
}

在使用這個(gè)類時(shí),會(huì)顯示:

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

2)源代碼

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

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

3、@SuppressWarnings

1)介紹

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

例如:

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

當(dāng)我們聲明了一個(gè)整型變量,而沒有使用它時(shí),就會(huì)出現(xiàn)警告:

這時(shí),我們就可以使用 @SuppressWarnings 抑制這個(gè)警告:

public class Example {
	@SuppressWarnings({"all"}) // 這個(gè)注解有屬性,所以需要傳入屬性值,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 注解能修飾類、接口、注解、枚舉、字段等類型,只會(huì)在源代碼中保留。

3)屬性可取值

unchecked:

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

deprecation:

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

rawtypes:

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

unused:

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

fallthrough:

  • 抑制在switch語句中缺少break語句導(dǎo)致的警告。

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

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

相關(guān)文章

最新評(píng)論

西乌珠穆沁旗| 平塘县| 安乡县| 马山县| 津南区| 济阳县| 白河县| 通榆县| 德江县| 临安市| 资源县| 双鸭山市| 崇仁县| 克东县| 德州市| 宾阳县| 海丰县| 麻阳| 尼勒克县| 綦江县| 海南省| 永善县| 乡城县| 潜江市| 元谋县| 灵川县| 丰台区| 昌邑市| 揭东县| 永康市| 颍上县| 富阳市| 新沂市| 襄汾县| 威宁| 禹州市| 武乡县| 南汇区| 建湖县| 车致| 石景山区|