如何获取注解中属性的默认值?

robot_l
  • 72

想实现这样一个功能,自定义了一个注解,如果使用者设置了其中的某些属性,就把这些属性放入一个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()实现,那这个方法又是干嘛的?

回复
阅读 3.6k
2 个回答

不知道哪里写错了,问题中的实现方式是没错的,不过意外的发现更好的实现方式:

 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";
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏