1:註解與註釋的區別
註解會被編譯,註釋不會被編譯;註解是寫給JVM看的,註釋是寫給人看的方便理解代碼。
2:經常使用註解
@Retention
Retention 的英文意爲保留期的意思。當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。
它的取值以下:
RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。註解默認使用這種方式。
RetentionPolicy.RUNTIME 註解能夠保留到程序運行的時候,它會被加載進入到 JVM 中,因此在程序運行時能夠獲取到它們。所以能夠使用反射機制讀取該註解的信息。
@Documented
顧名思義,這個元註解確定是和文檔有關。它的做用是可以將註解中的元素包含到 Javadoc 中去。
@Target
Target 是目標的意思,@Target 指定了註解運用的地方。
你能夠這樣理解,當一個註解被 @Target 註解時,這個註解就被限定了運用的場景。
@Target 有下面的取值
ElementType.ANNOTATION_TYPE 能夠給一個註解進行註解
ElementType.CONSTRUCTOR 能夠給構造方法進行註解
ElementType.FIELD 能夠給屬性進行註解
ElementType.LOCAL_VARIABLE 能夠給局部變量進行註解
ElementType.METHOD 能夠給方法進行註解
ElementType.PACKAGE 能夠給一個包進行註解
ElementType.PARAMETER 能夠給一個方法內的參數進行註解
ElementType.TYPE 能夠給一個類型進行註解,好比類、接口、枚舉
@Inherited
Inherited 是繼承的意思,可是它並非說註解自己能夠繼承,而是說若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。
@Repeatable
Repeatable 天然是可重複的意思。@Repeatable 是 Java 1.8 才加進來的,因此算是一個新的特性。
3:註解的寫法java
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;.net
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD })
public @interface TestAnnotation {
int age() default 18;
String name() default "sam";
}
4:註解的使用
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.company.demo.annotation.TestAnnotation;繼承
public class Test10 {
public static void main(String[] args) {
AnnotationTest ann = new AnnotationTest();
Class cls = ann.getClass();
Method[] methods = cls.getDeclaredMethods();
for(Method m:methods) {
if(m.isAnnotationPresent(TestAnnotation.class)) {
try {
TestAnnotation test = m.getAnnotation(TestAnnotation.class);
m.invoke(ann, 0,"wang");
System.out.println("age=:"+test.age());
System.out.println("name=:"+test.name());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}接口
}文檔
}
class AnnotationTest{
@TestAnnotation(name="lily",age=18)
String name;
int age;
@TestAnnotation(name="lily",age=18)
void sayhello(int weight,String color) {
System.out.println("hello world!"+weight+color);
}
void sayName() {
System.out.println("hello my name is sam!");
}
}get