一、元注解(注解的注解)
- @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.若使用了,則可提取注解中的值注入方法或給成員變量賦值。