Java使用注解与反射做参数值验证玩法

2022-05-12 09:41:22 浏览数 (2)

注解玩法

注解定义三个值

代码语言:javascript复制
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ FIELD, METHOD })
public @interface ParameterA {
    String[] info() default {};

    String description() default "";

    Class<? extends IParameterValidator>[] validateWith() default NoValidator.class;
}

主函数

如果存在多个注解可以先进行包装,后续统一处理

包装后将注解与关联量的field或method封装到Parameterized

代码语言:javascript复制
public class Parameterized {
    private Object object;
    private Field field;
    private Method method;
    private WrappedParameter wrappedParameter;
...
...

构造MAP<name,Parameterized>便于后续使用

构造MAP前需要用reflect把需要的值列出来make list!

代码语言:javascript复制
public static List<Parameterized> collectList(Object arg) {
        List<Parameterized> result = ListUtil.newArrayList();
        Class<?> rootClass = arg.getClass();

        Set<Class<?>> types = ClassUtil.describeClassTree(rootClass);

        for (Class<?> cls : types) {
            for (Field f : cls.getDeclaredFields()) {
                Annotation pa = f.getAnnotation(ParameterA.class);
                Annotation pb = f.getAnnotation(ParameterB.class);
                if (pa != null) {
                    result.add(new Parameterized(new WrappedParameter((ParameterA) pa), f, null, arg));
                } else if (pb != null) {
                    result.add(new Parameterized(new WrappedParameter((ParameterB) pb), f, null, arg));
                }
            }

            for (Method m : cls.getDeclaredMethods()) {
                Annotation pa = m.getAnnotation(ParameterA.class);
                Annotation pb = m.getAnnotation(ParameterB.class);
                if (pa != null) {
                    result.add(new Parameterized(new WrappedParameter((ParameterA) pa), null, m, arg));
                } else if (pb != null) {
                    result.add(new Parameterized(new WrappedParameter((ParameterB) pb), null, m, arg));
                }
            }
        }
        return result;
    }

反射验证玩法

注解中传入验证类

代码语言:javascript复制
// 注解定义
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ FIELD, METHOD })
public @interface ParameterA {
    String[] info() default {};

    String description() default "";

    Class<? extends IParameterValidator>[] validateWith() default NoValidator.class;
}



// 使用 
@ParameterA(info = {"i1", "i2"}, description = "i'm sentry", validateWith = PositiveInteger.class)
    String testParam1 = "test1";

给验证类提供所需值,然后实例话执行即可

注意需要提前定义验证接口

代码语言:javascript复制
public interface IParameterValidator {
    void validate(String name, String value);
}

DEMO

demo链接

0 人点赞