问答

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

作者:admin 2021-08-20 我要评论

想实现这样一个功能,自定义了一个注解,如果使用者设置了其中的某些属性,就把这些属性放入一个map,所以需要通过属性值和默认值之间的比较来判断是否是使用者...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

想实现这样一个功能,自定义了一个注解,如果使用者设置了其中的某些属性,就把这些属性放入一个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";
    }

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 使用箭头函数return数据不能实现

    使用箭头函数return数据不能实现

  • 个人小程序号能接入小程序3D地图吗?

    个人小程序号能接入小程序3D地图吗?

  • vue 移动端项目中,使用了better-scrol

    vue 移动端项目中,使用了better-scrol

  • css如何做出区域平均划分为四列

    css如何做出区域平均划分为四列

腾讯云代理商
海外云服务器