想实现这样一个功能,自定义了一个注解,如果使用者设置了其中的某些属性,就把这些属性放入一个map,所以需要通过属性值和默认值之间的比较来判断是否是使用者设置的,我使用了下面的方式但是并不生效:
MyAnnotation myAnnotation = someClass.getAnnotation(MyAnnotation.class);
String annotationField = "myField"
Object defaulValue = MyAnnotation.class.getDeclaredMethod(annotationField).getDefaultValue();
// defaulValue:null
...
@MyAnnotation
中定义的属性:
String myField() default "DEFAULT";
如果不是用getDefaultValue()实现,那这个方法又是干嘛的?
###不知道哪里写错了,问题中的实现方式是没错的,不过意外的发现更好的实现方式:
Map<String, Object> defaultValueMap = AnnotationType.getInstance(myAnnotation.annotationType()).memberDefaults();
可以一次性获取所有默认值(key为属性名,value为默认值)
动态获取注解值:
Object handler = Proxy.getInvocationHandler(annotationFrom);
Field field = handler.getClass().getDeclaredField("memberValues");
Map<String, Object> memberValues = (Map) field.get(handler))
判断使用者是否设置了注解值:
memberValues.equals(defaultValueMap)
###
写了个简单的demo,可以拿到默认值,可能哪里写错了吧
public static void main(String[] args) throws Exception {
Object myValue = MyAnnotation.class.getDeclaredMethod("myValue").getDefaultValue();
System.out.println(myValue); // hello
}
public @interface MyAnnotation {
String myValue() default "hello";
}