摘要:使用反射可以在運行時訪問類附加的注解。什么是注解注解是的新特性。注解是可以添加到代碼中的一種注釋或者說是元數據。的定義代碼在前標記一個注解。意味著注解只能在類型典型的類接口上使用。注解的詳細使用教程可以參考。
使用反射可以在運行時訪問Java類附加的注解。
什么是Java注解注解是Java5的新特性。注解是可以添加到Java代碼中的一種注釋或者說是元數據。注解可以使用預編譯工具在編譯時處理,或者通過反射在運行時處理。下面是類注解的示例:
@MyAnnotation(name="someName", value = "Hello World") public class TheClass { }
類TheClass最上方有注解@MyAnnotation。注解的定義和接口類似。MyAnnotation的定義代碼:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyAnnotation { public String name(); public String value(); }
@ 在interface前標記一個注解。一旦你定義一個注解,就可以在代碼中使用,就像例子中一樣。
在這個注解有2個指令,@Retention(RetentionPolicy.RUNTIME)和@Retention(RetentionPolicy.RUNTIME),指定定義的注解該如何使用。
@Retention(RetentionPolicy.RUNTIME) 意思是注解可以在運行時通過反射訪問。如果你沒有設置這個指令,注解將不能在運行時保存,因此也不能通過反射訪問。
@Target(ElementType.TYPE)意味著注解只能在類型(典型的類、接口)上使用。你同樣可以指定METHOD、Field,或者你可以允許所有目標包括類型、方法、屬性等。
注解的詳細使用教程可以參考Java Annotations tutorial。
你可以在運行時訪問一個類、方法、屬性的注解。訪問類的示例代碼如下:
Class aClass = TheClass.class; Annotation[] annotations = aClass.getAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } }
你也可以像這樣訪問類的特定注解:
Class aClass = TheClass.class; Annotation annotation = aClass.getAnnotation(MyAnnotation.class); if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); }方法注解
方法上的注解示例:
public class TheClass { @MyAnnotation(name="someName", value = "Hello World") public void doSomething(){} }
訪問方法注解代碼:
Method method = ... //obtain method object Annotation[] annotations = method.getDeclaredAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } }
訪問方法的特定注解代碼:
Method method = ... // obtain method object Annotation annotation = method.getAnnotation(MyAnnotation.class); if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); }參數注解
我們也可以把注解添加在方法的參數聲明上。示例如下:
public class TheClass { public static void doSomethingElse( @MyAnnotation(name="aName", value="aValue") String parameter){ } }
你可以通過Method對象訪問參數注解,代碼如下:
Method method = ... //obtain method object Annotation[][] parameterAnnotations = method.getParameterAnnotations(); Class[] parameterTypes = method.getParameterTypes(); int i=0; for(Annotation[] annotations : parameterAnnotations){ Class parameterType = parameterTypes[i++]; for(Annotation annotation : annotations){ if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("param: " + parameterType.getName()); System.out.println("name : " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } } }
注意:Method.getParameterAnnotations() 方法返回二維Annotation數組,包含每個參數上的注解數組。
屬性注解下面是屬性上添加注解的示例:
public class TheClass { @MyAnnotation(name="someName", value = "Hello World") public String myField = null; }
訪問屬性上所有注解的代碼:
Field field = ... //obtain field object Annotation[] annotations = field.getDeclaredAnnotations(); for(Annotation annotation : annotations){ if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } }
訪問屬性上的特定注解:
Field field = ... // obtain method object Annotation annotation = field.getAnnotation(MyAnnotation.class); if(annotation instanceof MyAnnotation){ MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77362.html
摘要:第章元編程與注解反射反射是在運行時獲取類的函數方法屬性父類接口注解元數據泛型信息等類的內部信息的機制。本章介紹中的注解與反射編程的相關內容。元編程本質上是一種對源代碼本身進行高層次抽象的編碼技術。反射是促進元編程的一種很有價值的語言特性。 第12章 元編程與注解、反射 反射(Reflection)是在運行時獲取類的函數(方法)、屬性、父類、接口、注解元數據、泛型信息等類的內部信息的機...
摘要:今天對此嘗試了一番,發現通過反射來動態修改注解的屬性值是可以做到的眾所周知,這個包下面都是的反射類和工具。一個注解通過指定其生命周期,本文所討論的動態修改注解屬性值,建立在這種情況。 昨晚看到一條問題,大意是樓主希望可以動態得建立多個Spring 的定時任務。 這個題目我并不是很熟悉,不過根據題目描述和查閱相關 Spring 創建定時任務 的資料,發現這也許涉及到通過Java代碼動態修...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(...
摘要:擴展了反射機制的,以幫助程序員快速的構造自定義注解處理器。返回該程序元素上存在的所有注解。在中,可以使用注解將一個繼承于的類標注為可以處理用戶請求的。 大家好,我是樂字節的小樂,上次給大家帶來了Java注解-元數據、注解分類、內置注解和自定義注解|樂字節,這次接著往下講注解處理器和servlet3.0showImg(https://segmentfault.com/img/bVbvBP...
閱讀 1074·2021-11-16 11:45
閱讀 2708·2021-09-27 13:59
閱讀 1315·2021-08-31 09:38
閱讀 3143·2019-08-30 15:52
閱讀 1315·2019-08-29 13:46
閱讀 2085·2019-08-29 11:23
閱讀 1631·2019-08-26 13:47
閱讀 2476·2019-08-26 11:54