我一直在尝试在类加载注释类型时做一些逻辑。自然地,我想到了静态块。
但不幸的是,这是不允许的,Eclipse 中的编译错误是:
Syntax error, insert "enum Identifier" to complete EnumHeader
我的注释声明是:
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target(FIELD)
@Validate
public @interface StringSize {
int max();
int min() default 0;
static {
Validator.registerCallback(StringSize.class, (Field f, Object parent) -> {
Object o = f.get(parent);
if(!(o instanceof CharSequence))
throw new IllegalAnnotationException("@StringSize allowed on CharSequence fields only.");
CharSequence str = (CharSequence) o;
StringSize size = f.getAnnotation(StringSize.class);
if(str.length() < size.min())
throw new AssertionError(str + " - length < " + size.min());
if(str.length() > size.max())
throw new AssertionError(str + " - length > " + size.max());
});
}
}
我正在尝试做的是构建一个验证器,该验证器通过一个又一个字段并检查任何非法值。
现在,这个框架完全不知道什么被认为是“非法值”,即由这个框架的任何潜在用户来创建他们自己的规则,从而创建任意数量的自定义注释并将其映射到一个回调方法,该方法知道如何来验证它。
@Validate
是在验证框架中用于将注释标记为验证器的自定义元注释(类似于 CDI 的@Qualifier
)。框架所做的只是,当Validator.validate(obj)
被调用以扫描所有字段时,如果它的任何注释具有元注释@Validate
,则查找其对应的回调方法并使用作为参数传递的该字段来调用它。回调对找到的任何非法值抛出异常。
我正在尝试找到一种通用的方法来进行注释回调映射,因此最终用户不必手动进行映射,而是自定义注释的作者。所以这就是我最终尝试的。
知道如何克服这个限制吗?