204
阿裏雲
技術社區[雲棲]
Java Reflection(八):注解
內容索引
什麼是注解
類注解
方法注解
參數注解
變量注解
利用Java反射機製可以在運行期獲取Java類的注解信息。
什麼是注解
注解是Java 5的一個新特性。注解是插入你代碼中的一種注釋或者說是一種元數據(meta data)。這些注解信息可以在編譯期使用預編譯工具進行處理(pre-compiler tools),也可以在運行期使用Java反射機製進行處理。下麵是一個類注解的例子:
1 |
@MyAnnotation (name= "someName" , value = "Hello World" )
|
2 |
public class TheClass {
|
在TheClass類定義的上麵有一個@MyAnnotation的注解。注解的定義與接口的定義相似,下麵是MyAnnotation注解的定義:
1 |
@Retention (RetentionPolicy.RUNTIME)
|
2 |
@Target (ElementType.TYPE)
|
4 |
public @interface MyAnnotation {
|
在interface前麵的@符號表名這是一個注解,一旦你定義了一個注解之後你就可以將其應用到你的代碼中,就像之前我們的那個例子那樣。
在注解定義中的兩個指示@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.TYPE),說明了這個注解該如何使用。
@Retention(RetentionPolicy.RUNTIME)表示這個注解可以在運行期通過反射訪問。如果你沒有在注解定義的時候使用這個指示那麼這個注解的信息不會保留到運行期,這樣反射就無法獲取它的信息。
@Target(ElementType.TYPE) 表示這個注解隻能用在類型上麵(比如類跟接口)。你同樣可以把Type改為Field或者Method,或者你可以不用這個指示,這樣的話你的注解在類,方法和變量上就都可以使用了。
關於Java注解更詳細的講解可以訪問Java Annotations tutorial。
類注解
你可以在運行期訪問類,方法或者變量的注解信息,下是一個訪問類注解的例子:
01 |
Class aClass = TheClass. class ;
|
02 |
Annotation[] annotations = aClass.getAnnotations(); |
04 |
for (Annotation annotation : annotations){
|
05 |
if (annotation instanceof MyAnnotation){
|
06 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
07 |
System.out.println( "name: " + myAnnotation.name());
|
08 |
System.out.println( "value: " + myAnnotation.value());
|
你還可以像下麵這樣指定訪問一個類的注解:
1 |
Class aClass = TheClass. class ;
|
2 |
Annotation annotation = aClass.getAnnotation(MyAnnotation. class );
|
4 |
if (annotation instanceof MyAnnotation){
|
5 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
6 |
System.out.println( "name: " + myAnnotation.name());
|
7 |
System.out.println( "value: " + myAnnotation.value());
|
方法注解
下麵是一個方法注解的例子:
1 |
public class TheClass {
|
2 |
@MyAnnotation (name= "someName" , value = "Hello World" )
|
3 |
public void doSomething(){}
|
你可以像這樣訪問方法注解:
01 |
Method method = ... //獲取方法對象
|
02 |
Annotation[] annotations = method.getDeclaredAnnotations(); |
04 |
for (Annotation annotation : annotations){
|
05 |
if (annotation instanceof MyAnnotation){
|
06 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
07 |
System.out.println( "name: " + myAnnotation.name());
|
08 |
System.out.println( "value: " + myAnnotation.value());
|
你可以像這樣訪問指定的方法注解:
1 |
Method method = ... // 獲取方法對象
|
2 |
Annotation annotation = method.getAnnotation(MyAnnotation. class );
|
4 |
if (annotation instanceof MyAnnotation){
|
5 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
6 |
System.out.println( "name: " + myAnnotation.name());
|
7 |
System.out.println( "value: " + myAnnotation.value());
|
參數注解
方法參數也可以添加注解,就像下麵這樣:
1 |
public class TheClass {
|
2 |
public static void doSomethingElse(
|
3 |
@MyAnnotation (name= "aName" , value= "aValue" ) String parameter){
|
你可以通過Method對象來訪問方法參數注解:
01 |
Method method = ... //獲取方法對象
|
02 |
Annotation[][] parameterAnnotations = method.getParameterAnnotations(); |
03 |
Class[] parameterTypes = method.getParameterTypes(); |
06 |
for (Annotation[] annotations : parameterAnnotations){
|
07 |
Class parameterType = parameterTypes[i++];
|
09 |
for (Annotation annotation : annotations){
|
10 |
if (annotation instanceof MyAnnotation){
|
11 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
12 |
System.out.println( "param: " + parameterType.getName());
|
13 |
System.out.println( "name : " + myAnnotation.name());
|
14 |
System.out.println( "value: " + myAnnotation.value());
|
需要注意的是Method.getParameterAnnotations()方法返回一個注解類型的二維數組,每一個方法的參數包含一個注解數組。
變量注解
下麵是一個變量注解的例子:
1 |
public class TheClass {
|
3 |
@MyAnnotation (name= "someName" , value = "Hello World" )
|
4 |
public String myField = null ;
|
你可以像這樣來訪問變量的注解:
01 |
Field field = ... //獲取方法對象</pre>
|
02 |
<pre>Annotation[] annotations = field.getDeclaredAnnotations(); |
04 |
for (Annotation annotation : annotations){
|
05 |
if (annotation instanceof MyAnnotation){
|
06 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
07 |
System.out.println( "name: " + myAnnotation.name());
|
08 |
System.out.println( "value: " + myAnnotation.value());
|
你可以像這樣訪問指定的變量注解:
1 |
Field field = ... //獲取方法對象</pre>
|
3 |
Annotation annotation = field.getAnnotation(MyAnnotation. class );
|
5 |
if (annotation instanceof MyAnnotation){
|
6 |
MyAnnotation myAnnotation = (MyAnnotation) annotation;
|
7 |
System.out.println( "name: " + myAnnotation.name());
|
8 |
System.out.println( "value: " + myAnnotation.value());
|
最後更新:2017-05-23 11:31:55