JAVA自定義注解詳情
原理:
注解的本質(zhì)是繼承Annotation的特殊接口,其具體實(shí)現(xiàn)類是Java運(yùn)行時(shí)生成的動(dòng)態(tài)代理類.而我們通過反射獲取注解時(shí),返回的是Java運(yùn)行時(shí)生成的動(dòng)態(tài)代理對(duì)象Proxy1,通過動(dòng)態(tài)代理對(duì)象,調(diào)用自定義注解(接口)的方法,最終會(huì)調(diào)用AnnotationInvocationHandler 的invoke方法.
元注解:
- @Documented:是否將注解包含到JavaDoc中
- @Retention:什么時(shí)候使用該注解,表明注解的生命周期
- @Target:注解用于什么地方
- @Inherited:是否允許子類繼承改注解
@Retention參數(shù)講解:
RetentionPolicy.SOURCE:
在編譯階段丟棄,這些注解在編譯結(jié)束后就不會(huì)再有意義,所以它不會(huì)寫入字節(jié)碼.比如@Override, @SuppressWarnings都屬于這類注解。
RetentionPolicy.CLASS:
在類加載的時(shí)候丟棄, 包含在類文件中
RetentionPolicy.RUNTIME:
包含在類文件中,在運(yùn)行時(shí)可以被獲取到
@Target:參數(shù)講解:
ElementType.TYPE
:用于類,接口,枚舉
ElementType.FIELD
:應(yīng)用于屬性
ElementType.METHOD
:應(yīng)用于方法
ElementType.PARAMETER
:用于方法的形式參數(shù)
ElementType.CONSTRUCTOR
:用于構(gòu)造函數(shù)
ElementType.LOCAL_VARIABLE
:應(yīng)用于局部變量
ElementType.ANNOTATION_TYPE
:應(yīng)用于注解類型
ElementType.PACKAGE:
應(yīng)用于包
ElementType.TYPE_PARAMETER
:應(yīng)用于類型變量(1.8新增)
ElementType.TYPE_USE
:1.8版本新增,應(yīng)用于任何使用類型的語句中
案例:
給一個(gè)類的String屬性設(shè)置默認(rèn)值
@Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ObjectFlag { //默認(rèn)值 String value() default "默認(rèn)值1"; }
public class ObjectTest { @ObjectFlag String name; @ObjectFlag Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }
public class ObjectRun { public static <T> T setValueField(T t) throws IllegalAccessException { Class<?> cls = t.getClass(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { boolean hasConfigField = field.isAnnotationPresent(ObjectFlag.class); field.setAccessible(true);//設(shè)置可以訪問私有變量 //若屬性上有注解,使用注解的值作為key去配置文件中查找 if (hasConfigField) { //獲取注解的默認(rèn)值 Object annoValue = field.getAnnotation(ObjectFlag.class).value(); System.out.println("當(dāng)前的屬性名稱為:" + field.getName()); System.out.println("當(dāng)前屬性類型:" + field.getGenericType().toString()); //獲取到屬性的數(shù)據(jù)類型 String type = field.getGenericType().toString(); if (type.endsWith("String")) {//如果是字符串類型 field.set(t, annoValue.toString()); } } else { //若屬性上沒有注解,則使用屬性名作為key去配置文件中查找 System.out.println("屬性" + field.getGenericType().toString() + "沒有該注解"); } } return t; } }
運(yùn)行結(jié)果:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之際的更多內(nèi)容!
相關(guān)文章
Struts攔截器實(shí)現(xiàn)攔截未登陸用戶實(shí)例解析
這篇文章主要介紹了Struts攔截器實(shí)現(xiàn)攔截未登陸用戶實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02教你使用springSecurity+jwt實(shí)現(xiàn)互踢功能
JWT作為一個(gè)開放的標(biāo)準(zhǔn)( RFC 7519 ),定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以Json對(duì)象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實(shí)現(xiàn)互踢功能,需要的朋友可以參考下2021-11-11springboot項(xiàng)目中全局設(shè)置用UTC+8
本文主要介紹了springboot項(xiàng)目中全局設(shè)置用UTC+8,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java并發(fā)線程之線程池的知識(shí)總結(jié)
這篇文章主要介紹了Java并發(fā)線程之線程池的知識(shí)總結(jié),幫助大家更好的理解和學(xué)習(xí)Java并發(fā)線程的相關(guān)內(nèi)容,感興趣的朋友可以了解下2021-01-01關(guān)于SpringBoot使用@Async的總結(jié)
這篇文章主要介紹了關(guān)于SpringBoot使用@Async的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說明
這篇文章主要介紹了Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08