Java 注解

一、元注解(注解的注解)

  • @Retention 表明注解的存活的時(shí)間。取值如下:
RetentionPolicy.SOURCE 注解只在源碼階段保留,在編譯器進(jìn)行編譯時(shí)它將被丟棄忽視。
RetentionPolicy.CLASS 注解只被保留到編譯進(jìn)行的時(shí)候,它并不會(huì)被加載到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序運(yùn)行的時(shí)候,它會(huì)被加載進(jìn)入到 JVM 中,所以在程序運(yùn)行時(shí)可以獲取到它們。
  • @Documented 說(shuō)明文檔。
它的作用是能夠?qū)⒆⒔庵械脑匕?Javadoc 中去。
  • @Target 指明注解使用的地方。取值如下:
ElementType.ANNOTATION_TYPE 可以給一個(gè)注解進(jìn)行注解
ElementType.CONSTRUCTOR 可以給構(gòu)造方法進(jìn)行注解
ElementType.FIELD 可以給屬性進(jìn)行注解
ElementType.LOCAL_VARIABLE 可以給局部變量進(jìn)行注解
ElementType.METHOD 可以給方法進(jìn)行注解
ElementType.PACKAGE 可以給一個(gè)包進(jìn)行注解
ElementType.PARAMETER 可以給一個(gè)方法內(nèi)的參數(shù)進(jìn)行注解
ElementType.TYPE 可以給一個(gè)類型進(jìn)行注解,比如類、接口、枚舉
  • @Inherited 繼承父類注解。
使用 @Inherited 標(biāo)注的注解去注解一個(gè)父類,若這個(gè)父類的子類沒(méi)有使用任何注解,這該子類相當(dāng)于使用了 @Inherited 標(biāo)注的那個(gè)注解。

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}

@Test
public class A {}

public class B extends A {}

說(shuō)明:子類 B 相當(dāng)于有 @Test 的注解。
  • @Repeatable 可重復(fù)使用的注解
@interface Persons {
    Person[]  value();
}


@Repeatable(Persons.class)
@interface Person{
    String role default "";
}


@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
    
}

說(shuō)明:注解 @Person 使用了 @Repeatable 元注解,所以 @Person 可以使用多次。
其中多次使用時(shí)所帶的參數(shù)存放在 @Persons 中(@Repeatable 中注入了 Persons.class)。

二、Java 中自帶的注解

  • @Deprecated 過(guò)時(shí)的方法、過(guò)時(shí)的類、過(guò)時(shí)的成員變量。
  • @Override 繼承。
  • @SuppressWarnings 阻止警告。
  • @FunctionalInterface 函數(shù)式接口 ,就是一個(gè)具有一個(gè)方法的普通接口。

三、注解的屬性

  • 注解只傳遞值
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    
    int id(); default -1;
    
    String msg(); default "Hi";

}

說(shuō)明:注解 @TestAnnotation,有兩個(gè)屬性值:名為 id 的 int 型的屬性值;名為 msg 的 String 型的屬性值。
其中 id 的默認(rèn)值為 -1;msg 的默認(rèn)值為 "Hi"
  • 使用注解時(shí)傳值
@TestAnnotation(id=3,msg="hello annotation")
public class Test {

}

//使用默認(rèn)值傳值
@TestAnnotation()
public class Test {

}
  • 注解中只有一個(gè)值時(shí)的使用
public @interface Check {
    String value();
}

//使用
@Check(value="hi")
int a;

//等同于上面的使用
@Check("hi")
int a;
  • 沒(méi)有值的注解的使用
public @interface Perform {}

//使用
@Perform
public void testMethod(){}

四、注解的提取

  • isAnnotationPresent 判斷是否使用了某注解。
//判斷 Test 類是否使用了 TestAnnotation 注解
boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
  • getAnnotation 獲取注解對(duì)象
//獲取在 Test 類上使用的 TestAnnotaion 注解
TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
  • 獲取注解對(duì)象中的值
//直接使用注解對(duì)象 . 屬性值
System.out.println("id:"+testAnnotation.id());
System.out.println("msg:"+testAnnotation.msg());

1.利用反射獲取類中的方法或成員變量
2.判斷方法或成員變量是否使用了某個(gè)注解
3.若使用了,則可提取注解中的值注入方法或給成員變量賦值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容