
Java注解是一個很重要的知識點,掌握好Java注解有利于學習Java開發框架底層實作,@mikechen
Java注解定義
Java注解又稱Java標注,是在 JDK5 時引入的新特性,注解(也被稱為元資料),
Java注解它提供了一種安全的類似注釋的機制,用來將任何的資訊或元資料(metadata)與程式元素(類、方法、成員變數等)進行關聯,
Java注解是附加在代碼中的一些元資訊,用于一些工具在編譯、運行時進行決議和使用,起到說明、配置的功能,
Java注解應用
1.生成檔案這是最常見的,也是java 最早提供的注解;
2.在編譯時進行格式檢查,如@Override放在方法前,如果你這個方法并不是覆寫了超類方法,則編譯時就能檢查出;
3.跟蹤代碼依賴性,實作替代組態檔功能,比較常見的是spring 2.5 開始的基于注解配置,作用就是減少配置;
4.在反射的 Class, Method, Field 等函式中,有許多于 Annotation 相關的介面,可以在反射中決議并使用 Annotation,
Java注解分類

1、Java自帶的標準注解
包括@Override、@Deprecated、@SuppressWarnings等,使用這些注解后編譯器就會進行檢查,
2、元注解
元注解是用于定義注解的注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等,
元注解也是Java自帶的標準注解,只不過用于修飾注解,比較特殊,
3、自定義注解
用戶可以根據自己的需求定義注解,
Java標準注解
JDK 中內置了以下注解:

1.@Override
如果試圖使用 @Override 標記一個實際上并沒有覆寫父類的方法時,java 編譯器會告警,
class Parent { public void test() { } } class Child extends Parent { /** * 放開下面的注釋,編譯時會告警 */ /* @Override public void test() { } */ }
2.Deprecated
@Deprecated 用于標明被修飾的類或類成員、類方法已經廢棄、過時,不建議使用, @Deprecated class TestClass { // do something }
3.@SuppressWarnings
@SuppressWarnings 用于關閉對類、方法、成員編譯時產生的特定警告,
1)抑制單型別的警告
@SuppressWarnings("unchecked")
public void addItems(String item){
@SuppressWarnings("rawtypes")
List items = new ArrayList();
items.add(item);
}
2)抑制多型別的警告
@SuppressWarnings(value=https://www.cnblogs.com/mikechenshare/p/{"unchecked", "rawtypes"})
public void addItems(String item){
List items = new ArrayList();
items.add(item);
}
3)抑制所有型別的警告
@SuppressWarnings("all")
public void addItems(String item){
List items = new ArrayList();
items.add(item);
}
@SuppressWarnings 注解的常見引數值的簡單說明:

4.@FunctionalInterface
@FunctionalInterface 用于指示被修飾的介面是函式式介面,在 JDK8 引入,
@FunctionalInterfacepublic interface UserService { void getUser(Long userId); // 默認方法,可以用多個默認方法 public default void setUser() { } // 靜態方法 public static void saveUser() { } // 覆寫Object中的equals方法 public boolean equals(Object obj);}
函式式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面,
Java元注解
元注解是java API提供的,是用于修飾注解的注解,通常用在注解的定義上:

1.@Retention
@ Retention用來定義該注解在哪一個級別可用,在源代碼中(SOURCE)、類檔案中(CLASS)或者運行時(RUNTIME),
@Retention 原始碼:
@Documented@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); } public enum RetentionPolicy { //此注解型別的資訊只會記錄在源檔案中,編譯時將被編譯器丟棄,也就是說 //不會保存在編譯好的類資訊中 SOURCE, //編譯器將注解記錄在類檔案中,但不會加載到JVM中,如果一個注解宣告沒指定范圍,則系統 //默認值就是Class CLASS, //注解資訊會保留在源檔案、類檔案中,在執行的時也加載到Java的JVM中,因此可以反射性的讀取, RUNTIME }
RetentionPolicy 是一個列舉型別,它定義了被 @Retention 修飾的注解所支持的保留級別:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) //注解資訊只能在源檔案中出現 public @interface Override { } @Documented@Retention(RetentionPolicy.RUNTIME) //注解資訊在執行時出現@Target(value=https://www.cnblogs.com/mikechenshare/p/{CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { } @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) //注解資訊在源檔案中出現 public @interface SuppressWarnings { String[] value(); }
2.@Documented
@Documented:生成檔案資訊的時候保留注解,對類作輔助說明
@Documented 示例
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
3.@Target
@Target:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)
@Target原始碼:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
ElementType 是一個列舉型別,它定義了被 @Target 修飾的注解可以應用的范圍:
4.@Inherited
@Inherited:說明子類可以繼承父類中的該注解
表示自動繼承注解型別, 如果注解型別宣告中存在 @Inherited 元注解,則注解所修飾類的所有子類都將會繼承此注解,
@Inherited public @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN; }
5.@Repeatable
@Repeatable 表示注解可以重復使用,
當我們需要重復使用某個注解時,希望利用相同的注解來表現所有的形式時,我們可以借助@Repeatable注解,
以 Spring @Scheduled 為例:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Schedules { Scheduled[] value(); } @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { // ... }
自定義注解
當我們理解了內置注解, 元注解和獲取注解的反射介面后,我們便可以開始自定義注解了,
創建自定義注解和創建一個介面相似,但是注解的interface關鍵字需要以@符號開頭,我們可以為注解宣告方法,
自定義注解格式:
// 元注解 public @interface 注解名稱{ // 屬性串列 }
我們先來看看注解的例子:
1.創建自定義注解
/** * 自定義注解例子 * * @author mikechen */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface HelloAnnotation { String value(); }
2.使用自定義注解
/** * 使用自定義注解 * * @author mikechen */ public class HelloAnnotationClient { @HelloAnnotation(value="Simple custom Annotation example") public void sayHello(){ System.out.println("Inside sayHello method.."); } }
3.測驗自定義注解
/** * 自定義注解測驗 * * @author mikechen */ public class HelloAnnotationTest { public static void main(String[] args) throws Exception { HelloAnnotationClient helloAnnotationClient=new HelloAnnotationClient(); Method method=helloAnnotationClient.getClass().getMethod("sayHello"); if(method.isAnnotationPresent(HelloAnnotation.class)){ HelloAnnotation helloAnnotation=method.getAnnotation(HelloAnnotation.class); //Get value of custom annotation System.out.println("Value : "+helloAnnotation.value()); //Invoke sayHello method method.invoke(helloAnnotationClient); } } }
以上
作者簡介
陳睿|mikechen,10年+大廠架構經驗,《BAT架構技術500期》系列文章作者,分享十余年BAT架構經驗以及面試心得!
閱讀mikechen的互聯網架構更多技術文章合集
Java并發|JVM|MySQL|Spring|Redis|分布式|高并發|架構師
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501974.html
標籤:Java
上一篇:Javaweb08-Ajax專案-分頁條件查詢 + 增刪改
下一篇:RocketMQ保姆級教程
