[转] Java @interface 自定义注解
[From]?http://blog.csdn.net/afterlife_qiye/article/details/53748973
?
1. 注解的好處
注解可以替代配置文件完成對某些功能的描述,減少程序配置;
在沒有配置文件的情況下,我們去觀察代碼,并不需要同時打開兩個文件來觀察這個字段到底對應數據庫的哪個列,減少了程序繁瑣性,使得代碼更加清晰易懂;
目前市面上流行的框架基本上都包含了注解配置,那么針對于開源項目,我們在閱讀項目代碼時,不懂注解如何實現,真的是舉步難堅,所以,學習注解也可以加強我們對開源項目源碼的解讀。
?
2. Java自帶注解
?
注解是Java1.5,JDK5.0引用的技術,與類,接口,枚舉處于同一層次?。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋?。
在Java中,自帶了三種注解,這三種注解存在于java.lang包中,首先我們講一講這些注解
?Override
它的作用是對覆蓋超類中方法的方法進行標記,如果被標記的類并沒有實際覆蓋超類,則編譯器會發出錯誤警告。?
很常見的一個注解,了解JavaOOP的小伙伴這個注解應該較為常用,告訴編譯器,我這個方法是重寫了父類方法,當然如果你的方法并沒有實際重寫父類方法時,那么編譯器就會顯示警告信息
?Deprecated
它的作用是對不應該再使用的方法添加注解,當編程人員使用這些方法時,將會在編譯時顯示提示信息?
當一個方法名或者類名上面此注解之后,編譯器會認為這個方法屬于過期方法,明顯的區別在于類名或者方法名上會畫一道刪除線,標識過期方法不影響方法的繼續使用
?SuppressWarnings
這個僅僅是告訴編譯器忽略特定的警告信息,例如在泛型中使用原生數據類型?
例如我們在使用一些以Deprecated注解的方法時,編譯器會提出黃線警告,那么只要在使用的地方加上@SuppressWarnings(“deprecation”)就可以使編譯器忽略這個警告?
此注釋常用的參數值有?:
? deprecation(忽略使用過時類或者方法),
? unchecked(忽略執行了未檢查裝換時警告)?,
? fallthrough(忽略switch直接指向到下一個case塊沒有break警告),
? path(忽略類路徑,源文件路徑中有不存在路徑時警告),
? serial(忽略可序列化類中沒有serialVersionUID時的警告),
? finally(任何finally不能正常執行時的警告),
? all(以上所有)
?
?
3. 自定義注解須知
首先,自定義注解我們必須了解四個元注解,什么是元注解?元注解指作用于注解之上的元數據或者元信息,簡單通俗的講,元注解就是注解的注解?.
Documented與Inherited是典型的標識性注解,也就是說在注解內部并沒有成員變量,沒有成員變量的注解稱為標識注解?
?Documented
指明擁有這個注解的元素可以被javadoc此類的工具文檔化。這種類型應該用于注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進行注解,這種類型的注解被作為被標注的程序成員的公共API?。
?Inherited
指明該注解類型被自動繼承。如果用戶在當前類中查詢這個元注解類型并且當前類的聲明中不包含這個元注解類型,那么也將自動查詢當前類的父類是否存在Inherited元注解,這個動作將被重復執行知道這個標注類型被找到,或者是查詢到頂層的父類。
?Retention
指明在什么級別顯示此注解
?
Retention主要的參數類型包括以下幾種:
RetentionPolicy.SOURCE?注解存在于源代碼中,編譯時會被拋棄
RetentionPolicy.CLASS?注解會被編譯到class文件中,但是JVM會忽略
RetentionPolicy.RUNTIME JVM會讀取注解,同時會保存到class文件中
?
?Target
指明該類型的注解可以注解的程序元素的范圍
?
?
Target主要的參數類型包括以下幾種:
ElementType.TYPE?用于類,接口,枚舉但不能是注解
ElementType.FIELD?作用于字段,包含枚舉值
ElementType.METHOD?作用于方法,不包含構造方法
ElementType.PARAMETER?作用于方法的參數
ElementType.CONSTRUCTOR?作用于構造方法
ElementType.LOCAL_VERIABLE?作用于本地變量或者catch語句
ElementType.ANNOTATION_TYPE?作用于注解
ElementType.PACKAGE?作用于包
?
4. 實例應用
?注解的定義
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) //類上的注解 public @interface ClassAnnotation { String value() default "I am Class Annotation"; }?
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) //屬性上的注解 public @interface FieldAnnotation { String value() default "I am Field Annotation"; String operate() default "operate"; }?
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) //方法上的注解 public @interface MethodAnnotation { String value() default "I am Method Annotation"; String name() default "laobo"; }?
@interface?用于定義注解接口,接口中只能定義成員變量,且定義的成員變量必須以()結尾,可以使用default關鍵字為成員變量指定默認值,如果不為成員變量指定默認值的情況,則必須在引用注解時,對沒有默認值的成員變量進行賦值操作
注解的使用規則
?
//@注解名(變量1=變量1值,變量2=變量2值,...)
//如果注解中擁有數組類型,假設是String類型,那么賦值方式可以如下
//@注解名(String數組名稱={"tset1","test2","test3"})
//如果我們的注解中只有一個成員變量,且成員變量的名稱為value()
//那么可以使用如下賦值方式
//@注解名(屬性值)
//如果我們的注解中沒有成員變量,那么此時的注解被稱為標識注解 ?
?注解的使用
@ClassAnnotation //類上注解 public class TestAnnotation { //屬性注解 @FieldAnnotation(value = "老伯", operate = "啥都不干!") public String operate; //方法注解 @MethodAnnotation(value = "好人", name = "老伯") public void testMethod(){ System.out.println("這個測試方法!"); } }?
?解析注解
主要使用Java的反射原理實現對注解的解析
public class Test { public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("com.java._interface.blog.TestAnnotation"); Method[] methods = clazz.getMethods(); boolean flag = clazz.isAnnotationPresent(ClassAnnotation.class); if(flag){ ClassAnnotation classAnnotation = (ClassAnnotation) clazz.getAnnotation(ClassAnnotation.class); System.out.println(classAnnotation.value()); } boolean methodFlag = methods[0].isAnnotationPresent(MethodAnnotation.class); if(methodFlag){ MethodAnnotation methodAnnotation = (MethodAnnotation) methods[0].getAnnotation(MethodAnnotation.class); System.out.println(methodAnnotation.name() + methodAnnotation.value()); } Field[] fields = clazz.getDeclaredFields(); boolean fieldFlag = fields[0].isAnnotationPresent(FieldAnnotation.class); if(fieldFlag){ FieldAnnotation fieldAnnotation = fields[0].getAnnotation(FieldAnnotation.class); System.out.println(fieldAnnotation.value()); } } }?
轉載于:https://www.cnblogs.com/pekkle/p/8529320.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[转] Java @interface 自定义注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj3050 穷竭搜索 挑战程序设计竞
- 下一篇: Linux查看系统cpu个数、核心数、线