摘要:使用反射可以在運行時訪問類附加的注解。什么是注解注解是的新特性。注解是可以添加到代碼中的一種注釋或者說是元數(shù)據(jù)。的定義代碼在前標記一個注解。意味著注解只能在類型典型的類接口上使用。注解的詳細使用教程可以參考。
使用反射可以在運行時訪問Java類附加的注解。
什么是Java注解注解是Java5的新特性。注解是可以添加到Java代碼中的一種注釋或者說是元數(shù)據(jù)。注解可以使用預(yù)編譯工具在編譯時處理,或者通過反射在運行時處理。下面是類注解的示例:
@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) 意思是注解可以在運行時通過反射訪問。如果你沒有設(shè)置這個指令,注解將不能在運行時保存,因此也不能通過反射訪問。
@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()); }參數(shù)注解
我們也可以把注解添加在方法的參數(shù)聲明上。示例如下:
public class TheClass { public static void doSomethingElse( @MyAnnotation(name="aName", value="aValue") String parameter){ } }
你可以通過Method對象訪問參數(shù)注解,代碼如下:
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數(shù)組,包含每個參數(shù)上的注解數(shù)組。
屬性注解下面是屬性上添加注解的示例:
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()); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77362.html
摘要:第章元編程與注解反射反射是在運行時獲取類的函數(shù)方法屬性父類接口注解元數(shù)據(jù)泛型信息等類的內(nèi)部信息的機制。本章介紹中的注解與反射編程的相關(guān)內(nèi)容。元編程本質(zhì)上是一種對源代碼本身進行高層次抽象的編碼技術(shù)。反射是促進元編程的一種很有價值的語言特性。 第12章 元編程與注解、反射 反射(Reflection)是在運行時獲取類的函數(shù)(方法)、屬性、父類、接口、注解元數(shù)據(jù)、泛型信息等類的內(nèi)部信息的機...
摘要:今天對此嘗試了一番,發(fā)現(xiàn)通過反射來動態(tài)修改注解的屬性值是可以做到的眾所周知,這個包下面都是的反射類和工具。一個注解通過指定其生命周期,本文所討論的動態(tài)修改注解屬性值,建立在這種情況。 昨晚看到一條問題,大意是樓主希望可以動態(tài)得建立多個Spring 的定時任務(wù)。 這個題目我并不是很熟悉,不過根據(jù)題目描述和查閱相關(guān) Spring 創(chuàng)建定時任務(wù) 的資料,發(fā)現(xiàn)這也許涉及到通過Java代碼動態(tài)修...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)與程序元素類方法成員變量等進行關(guān)聯(lián)。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業(yè)務(wù)邏輯無關(guān),并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(...
摘要:擴展了反射機制的,以幫助程序員快速的構(gòu)造自定義注解處理器。返回該程序元素上存在的所有注解。在中,可以使用注解將一個繼承于的類標注為可以處理用戶請求的。 大家好,我是樂字節(jié)的小樂,上次給大家?guī)砹薐ava注解-元數(shù)據(jù)、注解分類、內(nèi)置注解和自定義注解|樂字節(jié),這次接著往下講注解處理器和servlet3.0showImg(https://segmentfault.com/img/bVbvBP...
閱讀 1083·2021-11-16 11:45
閱讀 2731·2021-09-27 13:59
閱讀 1326·2021-08-31 09:38
閱讀 3157·2019-08-30 15:52
閱讀 1323·2019-08-29 13:46
閱讀 2095·2019-08-29 11:23
閱讀 1654·2019-08-26 13:47
閱讀 2501·2019-08-26 11:54