來源自 這裡
Preface:
使用 Java 反射的特性 (Reflection) 可以讓你在執行時獲取 Java 類別上面定義的 annotation, 底下將介紹如何取得 Java 類別, 方法與屬性上面定義的 annotation.
What are Java Annotations?
Annotation 是在 Java 5 以後增加的 feature, 它有點類似定義所謂的 meta data 到 Java 的代碼中. 如此你可以在 compile java 成 class 時知道一些額外的訊息 (如是否抑制 warning 訊息 etc) 或是在執行時期取出這些 annotations 作為判斷後續處理的依據. 底下是一個使用 annotation 的範例:
在上面的範例中, 我們在類別
TheClass上面標記了 annotation "MyAnnotation", 而此 annotation 是一個自訂義的 annotation, 你可以如下定義 annotation:
在 annotation "MyAnnotation" 中我們又標記了下面兩個 annotation:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
而更多有關 Java annotation 的說明可以參考 這裡
Class Annotations:
當你在類別上面定義了 annotation 且該 annotation 是 Runtime 可以 access 的, 則你可以如下從類別中取出它的 annotation:
如果你要取出特定的 annotation 也可以參考下面的方法:
Method Annotations:
如果你是要在方法上面使用 annotation, 則剛剛的 "MyAnnotation" 便不能使用, 因此我又定義一個使用在方法上的 annotation:
並在類別 TheClass 上面的方法
doSomething 標記 "MAnnotation":
如此你便可以使用下面方法取出
doSomething 上面的所有 annotation:
或者你可以如下取出特定的 annotation:
Parameter Annotations:
你也可以在方法上的參數使用 annotation, 首先定義使用的 annotation 如下:
接著可以在方法
doSomething 上的參數 p 標記 "PAnnotation":
接著你可以參考下面方法取出方法所有參數與其對應的 annotation:
Field Annotations:
最後同樣的在類別上面定義的屬性也可以進行標記, 首先定義使用的 annotation 如下:
並在類別
TheClass 上面的屬性 myField 標記如下:
接著可以如下取出該屬性上的 annotation:
或者如下取出特定的 annotation:
Supplement:
* 良葛格 > Java Essence > 標準小老鼠
* 良葛格 > Java Essence > 自訂小老鼠型態
* 良葛格 > Java Essence > 讀取小老鼠的心聲
* 良葛格 > Java Essence > 還有其它小老鼠
* Java Annotation入門 (cleverpig's blog)
Preface:
使用 Java 反射的特性 (Reflection) 可以讓你在執行時獲取 Java 類別上面定義的 annotation, 底下將介紹如何取得 Java 類別, 方法與屬性上面定義的 annotation.
What are Java Annotations?
Annotation 是在 Java 5 以後增加的 feature, 它有點類似定義所謂的 meta data 到 Java 的代碼中. 如此你可以在 compile java 成 class 時知道一些額外的訊息 (如是否抑制 warning 訊息 etc) 或是在執行時期取出這些 annotations 作為判斷後續處理的依據. 底下是一個使用 annotation 的範例:
- @MyAnnotation(name="someName", value = "Hello World")
- public class TheClass {
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface MyAnnotation {
- public String name();
- public String value();
- }
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
而更多有關 Java annotation 的說明可以參考 這裡
Class Annotations:
當你在類別上面定義了 annotation 且該 annotation 是 Runtime 可以 access 的, 則你可以如下從類別中取出它的 annotation:
- 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!=null)
- {
- MyAnnotation myAnnotation = (MyAnnotation) annotation;
- System.out.println("name: " + myAnnotation.name());
- System.out.println("value: " + myAnnotation.value());
- }
如果你是要在方法上面使用 annotation, 則剛剛的 "MyAnnotation" 便不能使用, 因此我又定義一個使用在方法上的 annotation:
- package test.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface MAnnotation {
- public String name();
- public String value();
- }
- @MAnnotation(name="someName", value = "Hello World")
- public void doSomething(){}
- Method method = TheClass.class.getMethod("doSomething");
- Annotation[] annotations = method.getDeclaredAnnotations();
- for (Annotation annotation : annotations) {
- if (annotation instanceof MAnnotation) {
- MAnnotation myAnnotation = (MAnnotation) annotation;
- System.out.println("name: " + myAnnotation.name());
- System.out.println("value: " + myAnnotation.value());
- }
- }
- Method method = TheClass.class.getMethod("doSomething");
- Annotation annotation = method.getAnnotation(MAnnotation.class);
- if(annotation!=null)
- {
- MAnnotation mAnnotation = (MAnnotation) annotation;
- System.out.println("name: " + mAnnotation.name());
- System.out.println("value: " + mAnnotation.value());
- }
你也可以在方法上的參數使用 annotation, 首先定義使用的 annotation 如下:
- package test.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.PARAMETER)
- public @interface PAnnotation {
- public String name();
- public String value();
- }
- public void doSomething(
- @PAnnotation(name="aName", value="aValue") int p
- ){}
- Method method = TheClass.class.getMethod("doSomething", int.class);
- 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 PAnnotation){
- PAnnotation myAnnotation = (PAnnotation) annotation;
- System.out.println("param: " + parameterType.getName());
- System.out.println("name : " + myAnnotation.name());
- System.out.println("value: " + myAnnotation.value());
- }
- }
- }
最後同樣的在類別上面定義的屬性也可以進行標記, 首先定義使用的 annotation 如下:
- package test.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.FIELD)
- public @interface FAnnotation {
- public String name();
- public String value();
- }
- @FAnnotation(name="someName", value = "Hello World")
- public String myField = null;
- Field field = TheClass.class.getField("myField");
- Annotation[] annotations = field.getDeclaredAnnotations();
- for (Annotation annotation : annotations) {
- if (annotation instanceof FAnnotation) {
- FAnnotation myAnnotation = (FAnnotation) annotation;
- System.out.println("name: " + myAnnotation.name());
- System.out.println("value: " + myAnnotation.value());
- }
- }
- Field field = TheClass.class.getField("myField");
- Annotation annotation = field.getAnnotation(FAnnotation.class);
- if(annotation!=null)
- {
- FAnnotation mAnnotation = (FAnnotation) annotation;
- System.out.println("name: " + mAnnotation.name());
- System.out.println("value: " + mAnnotation.value());
- }
* 良葛格 > Java Essence > 標準小老鼠
* 良葛格 > Java Essence > 自訂小老鼠型態
* 良葛格 > Java Essence > 讀取小老鼠的心聲
* 良葛格 > Java Essence > 還有其它小老鼠
* Java Annotation入門 (cleverpig's blog)
This message was edited 20 times. Last update was at 30/05/2013 16:12:08