註解是以前忽略的一個東西,然而今後參與到正規團隊開發中應該會比較重要,所以先學一學
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Outer {
String value() default "report";
int time() default 0;
}
@Outer
public class Ans {
public static void main(String[] args) {
test1();
test2();
}
static void test0() {
//註解添加於java SE5
//註解是一種特殊註釋,註釋會被編譯器忽略,註解會被打包入class文件,因此註解是一種用作標註的元數據。
//注意!JVM不會處理註解,也不識別註解
//註解分爲三類,1.由編譯器使用的註解,@Override,@SuppressWarnings等,他們不進入class文件,編譯後被丟棄
//2.處理class文件使用的註解,有些會進入class文件,一般都用於底層代碼
//3.程序運行時讀取的註解,加載後存在於JVM,是最常用的註解(java代碼讀取註解實現的功能,JVM不會識別註解)
//定義註解可以定義其參數,包括基本類型,String,枚舉類型,以及以上三種類型的數,參數都是常數
//沒有定義的參數會使用默認值
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Report {
String value() default "report";
int time() default 0;
}
@interface TT {} //博客中說所有註解都要定義Target和Retention,但是這個沒有定義也可以使用,不過不知道這樣的註解有沒有實際意義
static void test1() {
//我們用@interface定義註解,同時使用@Target等元註解修飾定義的註解
//註解中最常用的值最好定義爲value,所有值最好有default定義的默認值
//查看文件會發現存在名爲Report.class與TT.class的文件,說明註解也是一個類
class A {
//! @interface Report {}
}
//! @interface Report {}
//事實證明註解的定義不能存在於方法中(不管是方法中,還是方法的內部類中都不行)
}
@TT
@Report
int i;
static void test2() {
//獲取註解也是使用反射來獲取
System.out.println(Ans.class.isAnnotationPresent(Report.class)); //查看一個註解是否註解了某個類,對於方法和域也相似
System.out.println(Ans.class.isAnnotationPresent(Outer.class));
Outer outer = Ans.class.getAnnotation(Outer.class); //獲得一個類的註解,如果註解不存在就返回null
System.out.println(outer.value()); //註解不能直接作用於代碼,需要變相相關代碼才能使註解生效
}
}