JAVA自定義注解詳情
原理:
注解的本質(zhì)是繼承Annotation的特殊接口,其具體實現(xiàn)類是Java運行時生成的動態(tài)代理類.而我們通過反射獲取注解時,返回的是Java運行時生成的動態(tài)代理對象Proxy1,通過動態(tài)代理對象,調(diào)用自定義注解(接口)的方法,最終會調(diào)用AnnotationInvocationHandler 的invoke方法.
元注解:
- @Documented:是否將注解包含到JavaDoc中
- @Retention:什么時候使用該注解,表明注解的生命周期
- @Target:注解用于什么地方
- @Inherited:是否允許子類繼承改注解
@Retention參數(shù)講解:
RetentionPolicy.SOURCE:在編譯階段丟棄,這些注解在編譯結束后就不會再有意義,所以它不會寫入字節(jié)碼.比如@Override, @SuppressWarnings都屬于這類注解。
RetentionPolicy.CLASS:在類加載的時候丟棄, 包含在類文件中
RetentionPolicy.RUNTIME:包含在類文件中,在運行時可以被獲取到
@Target:參數(shù)講解:
ElementType.TYPE:用于類,接口,枚舉
ElementType.FIELD:應用于屬性
ElementType.METHOD:應用于方法
ElementType.PARAMETER:用于方法的形式參數(shù)
ElementType.CONSTRUCTOR:用于構造函數(shù)
ElementType.LOCAL_VARIABLE:應用于局部變量
ElementType.ANNOTATION_TYPE:應用于注解類型
ElementType.PACKAGE:應用于包
ElementType.TYPE_PARAMETER:應用于類型變量(1.8新增)
ElementType.TYPE_USE:1.8版本新增,應用于任何使用類型的語句中
案例:
給一個類的String屬性設置默認值
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectFlag {
//默認值
String value() default "默認值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);//設置可以訪問私有變量
//若屬性上有注解,使用注解的值作為key去配置文件中查找
if (hasConfigField) {
//獲取注解的默認值
Object annoValue = field.getAnnotation(ObjectFlag.class).value();
System.out.println("當前的屬性名稱為:" + field.getName());
System.out.println("當前屬性類型:" + 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;
}
}
運行結果:

總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之際的更多內(nèi)容!
相關文章
教你使用springSecurity+jwt實現(xiàn)互踢功能
JWT作為一個開放的標準( RFC 7519 ),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。接下來通過本文給大家介紹springSecurity+jwt實現(xiàn)互踢功能,需要的朋友可以參考下2021-11-11

