摘要:的在日常開發,特別是開發中使用廣泛,各種框架,測試框架多多少少都會引入一些注解。的功能是作用于程序元數據的特殊類型。而在編譯期使用注解則需要特殊的工具,本文不討論。可以看到通過類中的反射方法獲取到了這個類的注解以及其方法的注解。
Java的Annotation在日常開發,特別是java web開發中使用廣泛,各種web框架,測試框架多多少少都會引入一些注解。若對java注解有一個全面深入的了解,對于我們的開發工作會有很大的幫助。
Annotation的功能Annotation是作用于java程序元數據的特殊類型。本身和程序的邏輯隔離,程序的運行邏輯不會被Annotation影響。因此,Annotation在程序中的作用僅限于提供一種信息,定義Annotaiton時即把這種信息和被Annotation修飾的class,method,package等關聯了起來。感興趣的外部程序(如編譯器,運行時檢查系統,框架,工具等)即可通過反射機制從被修飾類型上獲取到關聯的Annotation,從而實現特殊的功能。因此可以說Annotaion是一種特殊的注釋,是給框架,編譯器,運行時檢查系統等外部系統看的注釋。
Anntation可以在運行時使用,也可以在編譯時使用。在運行時,Annotation是class類的一部分,獲取Annotation信息需要通過Class對象。而在編譯期使用注解則需要特殊的工具,本文不討論。
定義AnnotationAnnotation是java中一種獨立的類型,用@interface聲明,且繼承了Annotation接口。定義一個Annotation的目的無非是想注明一個類,一個field,乃至一個package擁有某項信息。因此Anntation的定義是非常輕量的,唯一要做的也只是定義在@interface體中定義一些name value對,定義形式類似于沒有方法體的方法。這些name可以有默認值也可以沒有默認值。Annotation的域可以使用8種基本類型和class,Enum等類型,例如下面代碼所示:
@interface TestAnnotation{ public String testNmae(); public String testNameValue() default "test"; public int testIntName() default 10; }
此外,Annotation定義時需要采用一些元注解來指定注解的屬性,這些元注解作用于自定義注解,指定了自定義注解的可見范圍,作用對象,是否可繼承等屬性,具體可見https://docs.oracle.com/javas...。
@Retention @Target @Documented @Inherited @Repeatable使用Annotation
Annotation的使用包括在編譯時使用和運行時使用,編譯時使用需要Annotation工具,此文不討論,在運行時使用需要用反射方法去獲取注解信息,然后根據獲取到的注解信息做自定義的處理。
處理Anntation和反射應用一樣。首先獲取需要處理的類或者方法等的Class對象,再用isAnnotationPresent方法檢測指定的Anntation類型是否注解了該類,也可以用Class對象的getAnnotation方法獲取到指定的Anntation對象。
代碼清單1.1是一個簡單的Annotation使用示例。
//1.1 // Description.java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface Description{ String value(); } //AnnotationTest.java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface AnnotationTest{ String name(); } //ClassWithAnnotation.java @Description("this is a class with description annotation") public class ClassWithAnnotation { @AnnotationTest(name="this is a method with annotation") public void doSth(){ System.out.println("i have a annotation"); } } //AnalysisAnnotation .java public class AnalysisAnnotation { public static void main(String[] args){ try{ Class> rtClass = Class.forName("annotation.ClassWithAnnotation"); Method[] methods = rtClass.getMethods(); boolean desctionExist = rtClass.isAnnotationPresent(Description.class); if(desctionExist){ Description description = rtClass.getAnnotation(Description.class); System.out.println("class"s annotation value:"+description.value()); for(Method method:methods){ if(method.isAnnotationPresent(AnnotationTest.class)){ AnnotationTest annotation = method.getAnnotation(AnnotationTest.class); System.out.println("method"s anntation value:"+annotation.name()); } } } } catch(ClassNotFoundException e){ e.printStackTrace(); } } }
運行結果如上。可以看到通過AnalysisAnnotation類中的反射方法獲取到了ClassWithAnnotation這個類的注解以及其方法的注解。編譯時代碼即可這樣獲取到注解信息,加以利用。運行時注解的一個常見例子是junit等測試框架,或根據注解來實現一些功能。
除了運行時可以使用注解,在編譯時也可以用注解,這個需要特殊的工具支持。常用來自動生成代碼。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64669.html
摘要:但是模塊化當中,無法掃描只有模塊中可以使用有兩種解決方案定義一個專門的資源模塊,并使用提供的接口,實現它,并將這個實現注冊為服務。有兩種方式使用或包名,包名模塊名使用運行時動態。 模塊設計的原則: 1、防止出現編譯時循環依賴(主要是編譯器不支持),但運行時是允許循環依賴的,比如GUI應用2、明確模塊的邊界 幾種模塊設計: API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:項目介紹日志脫敏是常見的安全需求。特性基于注解的日志脫敏可以自定義策略實現,策略生效條件常見的脫敏內置方案深拷貝,且原始對象不用實現任何接口。放在集合屬性上,且屬性為普通對象作為演示,集合中為普通的字符串。 項目介紹 日志脫敏是常見的安全需求。普通的基于工具類方法的方式,對代碼的入侵性太強。編寫起來又特別麻煩。 本項目提供基于注解的方式,并且內置了常見的脫敏方式,便于開發。 用戶也可以...
閱讀 1773·2023-04-25 22:42
閱讀 2212·2021-09-22 15:16
閱讀 3491·2021-08-30 09:44
閱讀 490·2019-08-29 16:44
閱讀 3308·2019-08-29 16:20
閱讀 2517·2019-08-29 16:12
閱讀 3390·2019-08-29 16:07
閱讀 670·2019-08-29 15:08