Java註解 1.註解的理解 註解(Annotation)也被稱為元數據(Metadata),用於修飾解釋 包、類、方法、屬性、構造器、局部變數等數據信息 和註釋一樣,註解不影響程式邏輯,但註解可以被編譯或者運行,相當於嵌入在代碼中的補充信息 在JavaSE中,註解的使用目的比較簡單,例如標記過時的 ...
Java註解
1.註解的理解
- 註解(Annotation)也被稱為元數據(Metadata),用於修飾解釋 包、類、方法、屬性、構造器、局部變數等數據信息
- 和註釋一樣,註解不影響程式邏輯,但註解可以被編譯或者運行,相當於嵌入在代碼中的補充信息
- 在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE中註解占據了更重要的角色,例如用來配置應用程式的任何切麵,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。
基本的Annotation介紹:
使用Annotation時要在其前面添加@符號,並把該Annotation當成一個修飾符使用。用於修飾它支持的程式元素
-
三個基本的Annotation:
-
@Override:限定某個方法,是重寫父類方法,該註釋只能用於方法
-
@Deprecated:用於表示某個程式元素(類、方法等)已過時
-
@SuppressWarnings:抑制編譯器警告
-
2.@Override註解
例子:
package li.annotation;
public class Override_ {
public static void main(String[] args) {
}
}
class Father{//父類
public void fly(){
System.out.println("Father fly ...");
}
}
class Son extends Father{//子類
//@Override 放在fly方法上,表示子類的fly方法重寫了父類的fly方法
//即使這裡沒有寫@Override,其實還是重寫了父類方法
//但是如果寫了@Override註解,編譯器就會檢查該方法是否整的重寫了父類的方法。
//如果的確重寫了就編譯通過,如果沒有構成重寫則編譯錯誤
//它的意義就在於語法的校驗
@Override
public void fly(){
System.out.println("Son fly ...");
}
}
@Override使用說明:
- @Override表示指定重寫父類的方法(從編譯層面驗證),如果父類沒有fly方法,則會報錯
- 如果不寫@Override註解,而父類仍有 public void fly(){},仍然構成重寫
- @Override只能修飾方法,不能修飾其他類、包、屬性等等
- 查看@Override註解源碼為
@Target(ElementType.METHOD)
,說明只能修飾方法 - @Target是修飾註解的註解,稱為元註解
點擊@Override進去可以看到Override的定義:
補充說明:@interface
的說明
@interface
不是介面,是註解類 ,在JDK1.5之後加入的
3.@Deprecated註解
Deprecated用於表示某個程式元素(類、方法等)已經過時
例子:
package li.annotation;
public class Deprecated_ {
public static void main(String[] args) {
AAA a = new AAA();
a.hi();
System.out.println(a.n1);
}
}
// @Deprecated 修飾某個元素,表示該元素已經過時
// 即 不再推薦使用,但是仍然可以使用
@Deprecated
class AAA{
@Deprecated
public int n1 = 10;
@Deprecated
public void hi(){
}
}
查看@Deprecated註解類的源碼:
@Deprecated使用說明:
- 用於表示某個程式元素(類、方法等)已過時
- @Deprecated可以修飾CONSTRUCTOR(構造器), FIELD(屬性), LOCAL_VARIABLE(局部變數), METHOD(方法), PACKAGE(包), PARAMETER(參數), TYPE(類型)
- @Deprecated的作用可以做到新舊版本的相容和過渡
3.@SuppressWarnings註解
@SuppressWarnings屬性介紹及屬性說明:(部分)
屬性 | 屬性說明 |
---|---|
all | 抑制所有警告 |
boxing | 抑制裝箱、拆箱操作時候的警告 |
cast | 抑制映射相關的警告 |
dep-ann | 抑制啟用註釋的警告 |
deprecation | 抑制過期方法警告 |
fallthrough | 抑制確在switch中缺失breaks的警告 |
finally | 抑制finally模塊沒有返回的警告 |
hiding | 抑制與隱藏變數的區域變數相關的警告 |
incomplete-switch | 忽略沒有完整的switch語句 |
nls | 忽略非nls格式的字元 |
null | 忽略對null的操作 |
rawtypes | 忽略沒有指定泛型的警告(傳參時沒有指定泛型的警告錯誤) |
restriction | 抑制使用不建議或禁止參照相關的警告 |
serial | 抑制與實現序列化的類遺漏serialVersionUID的的警告 |
static-access | 抑制不正確的靜態訪問方式警告 |
synthetic-access | 抑制子類沒有按最優方法訪問內部類的警告 |
unchecked | 抑制沒有進行類型檢查操作的警告 |
unqualified-field-access | 抑制沒有許可權訪問的域的警告 |
unused | 抑制沒被使用過的代碼的警告 |
例子:
package li.annotation;
import java.util.ArrayList;
import java.util.List;
// 1.當我們不希望看到警告時,可以使用@SuppressWarnings註解來抑制警告信息
// 2.在{""}中,可以寫入你希望抑制(不顯示)的警告信息
// 3.@SuppressWarnings的作用範圍和你放置的位置有關
// 比如 @SuppressWarnings放置在main方法,那麼抑制警告的範圍就是main方法
public class SuppressWarnings_ {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add("mary");
list.add("Bob");
System.out.println(list);//[jack, mary, Bob]
}
}
查看@SuppressWarnings源碼:
-
@SuppressWarnings可以放置的位置有:TYPE(類型), FIELD(屬性), METHOD(方法), PARAMETER(參數), CONSTRUCTOR(構造器), LOCAL_VARIABLE(局部變數)
-
該註解類有一個數組
String[] value()
,通過該數組可以在@SuppressWarnings({""})
中設置多個屬性,如@SuppressWarnings({"rawtypes","unchecked","unused"});
4.元註解
元註解的基本介紹:
JDK的元Annotation用於修飾其他Annotation
元註解的種類:
-
Retention:指定註解的作用範圍,三種:SOURCE,CLASS,RUNTIME
-
Target:指定註解可以在哪些地方使用
-
Documented:指定該註解是否會在javadoc中體現
-
Inherited:子類會繼承父類註解
4.1@Retention註解
說明:
只能用於修飾一個Annotation定義,用於指定該Annotation可以保留多長時間,@Rentention包含一個RetentionPolicy類型的成員變數,使用@Rentention時必須為該value成員變數指定值:
@Rentention的三種值:
- RetentionPolicy.SOURCE:編譯器使用後,直接丟棄這種策略的註解
- RetentionPolicy.CLASS:編譯器把註解記錄在class文件中,當運行Java程式時,JVM不會保留註解。這是預設值
- RetentionPolicy.RUNTIME:編譯器把註解記錄在class文件中,當運行Java程式時,JVM會保留註解。程式可以通過反射來獲取該註解
4.2@Target註解
基本說明:
用於修飾Annotation定義,用於指定 被修飾的Annotation可以用於修飾 哪些程式元素
@Target也包含一個名為value的成員變數
@Documented
@Retention(RetentionPolicy.RUNTIME)//它的作用範圍是RUNTIME
@Target(ElementType.ANNOTATION_TYPE)//這裡的ANNOTATION_TYPE 說明@Target只能修飾註解
public @interface Target {//註釋類
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
4.3@Documented註解
基本說明:
@Documented:用於指定被該元Annotation修飾的Annotation類將被 javadoc工具提取生成文檔,即在生成文檔時,可以看到該註解。
PS:定義為@Documented的註解必須設置Retention值為RUNTIME
4.4@Inherited註解
被它修飾的Annotation將具有繼承性,如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該註解