java注解,反射实现抽象代码工作中实际运用

注解类:ApiFieldAnnotation.java

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ApiFieldAnnotation {

    Class fieldClassType();

    boolean notNull();

    int maxLength() default -1;

    String fieldDesc();

    int scale() default 0;

}

测试代码:

 @Test
    public void testMyTest() throws Exception {
        MyBizPojo myBizPojo = new MyBizPojo();
        myBizPojo.setAccount("1111111111");
        myBizPojo.setName("CCCCCC");
        List<MyReturnPojo> params = Lists.newArrayList();
        java.lang.reflect.Field[] fields = myBizPojo.getClass().getDeclaredFields();
        for (java.lang.reflect.Field field : fields) {
            if (!field.isAnnotationPresent(ApiFieldAnnotation.class)) {
                continue;
            }
            ApiFieldAnnotation annotation = field.getAnnotation(ApiFieldAnnotation.class);
            field.setAccessible(true);
            MyReturnPojo myReturnPojo =
                    new MyReturnPojo(field.getName(), annotation.fieldDesc(), annotation.notNull(), field.get(myBizPojo));
            params.add(myReturnPojo);
        }
        params.forEach(p -> {
            System.out.println(p);
        });

    }

    @Data
    private class MyBizPojo {
        @ApiFieldAnnotation(fieldClassType = String.class, maxLength = 10, notNull = true, fieldDesc = "账号")
        private String account;

        @ApiFieldAnnotation(fieldClassType = String.class, maxLength = 10, notNull = true, fieldDesc = "名字")
        private String name;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private class MyReturnPojo {
        private String name;
        private String nameZh;
        private Boolean notNullFlag;
        private Object defaultValue;
    }


返回结果:

JxbkComponentTest.MyReturnPojo(name=account, nameZh=账号, notNullFlag=true, defaultValue=1111111111)
JxbkComponentTest.MyReturnPojo(name=name, nameZh=名字, notNullFlag=true, defaultValue=CCCCCC)


备注:

 Field[]getDeclaredFields() 
          返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
 booleanisAnnotationPresent(Class<? extends Annotation> annotationClass) 
          如果指定类型的注释存在于此元素上,则返回 true,否则返回 false


<T extends Annotation
T
getAnnotation(Class<T> annotationClass) 
          如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null

Objectget(Object obj) 
          返回指定对象上此 Field 表示的字段的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值