注解玩法
注解定义三个值
代码语言: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链接