先簡單解釋一下,註解是拿來幹嘛使的。
簡單的說,註解就是拿來給JVM看的,但是不參與編譯。也就是說註解引導JVM做一些操作,但不對源碼的執行產生影響。
JDK預定的註解
在Java中有一些常用的註解,已經由JDK幫我們定義好了,我們可以直接使用,(我)常用主要是以下三個:
1.@Override:重載
2.@Deprecated:表示該方法過期
3.@SuppressWarnings:壓制警告
用法:@SuppressWarnings(“all”)表示壓制所有的警告
自定義註解
自定義註解嘛顧名思義就是,自己按照自己的需求來定義一些註解。
在定義註解的時候,JDK還提供了一些用來修飾註解的註解,我們稱之爲“元註解”。
元註解
@Target:表示定義的註解的作用位置在哪裏
一般取值如下:
取值 | 作用位置 |
---|---|
TYPE | 類 |
METHOD | 方法 |
FIELD | 變量 |
@Retention:該註解保留的生命週期
一般取值爲RunTime
@Documented:標記該註解可否被抽取到API文檔中
@Inherited:該註解可否被其子類繼承
在定義註解時,會通過上述四個註解,來規定註解的一些規範。
定義註解
public @interface AnnotationName{
屬性列表;
//屬性列表類似接口中抽象方法的定義,可以定義的類型爲:基本數據類型、String、枚舉、註解及上述四種的數組
}
注意:如果在定義時使用了default值,在使用註解時可不進行屬性賦值。
註解的本質
實現Annotation接口,註解中的每個屬性就是對應抽象方法返回一個返回值。舉個例子:
a.定義註解@pro:
public @interface pro{
String ClassName();
}
b.對這段代碼編譯完成後的.class文件進行反編譯可以得到如下代碼:
public class pro implement Annotation{
public String ClassName(String Name){
return Name;
}
}
可以發現,其實,註解的本質就是實現了Annotation接口。
使用自定義註解
1.獲取使用註解標註的類的對象的字節碼文件對象
2.獲取註解對象
本質:在內存中生成了一個該註解接口實現類的對象
3.調用註解對象中定義的抽象方法,獲取返回值
好煩,上面這段文字都是啥,看個代碼吧
a. 定義一個註解
public @interface pro{
String ClassName();
String MethodName();
}
b.定義一個使用該註解的業務類
@Pro(ClassName = "...",MethodName = "...")//使用a中定義的註解
public class ReflectTest{
...;
...;
...;
}
c.如何使用自定義註解
Class <ReflectTest> refTest = ReflectTest.class;//獲取使用註解標註的類的對象的字節碼文件對象
Annotation ann = refTest.getAnnotation(pro.class);//獲取註解對象
String className = ann.ClassName();//獲取註解中ClassName值
String methodName = ann.MethodName();//獲取註解中MethodName值
完成!