0

我一直在尝试在类加载注释类型时做一些逻辑。自然地,我想到了静态块。

但不幸的是,这是不允许的,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,则查找其对应的回调方法并使用作为参数传递的该字段来调用它。回调对找到的任何非法值抛出异常。

我正在尝试找到一种通用的方法来进行注释回调映射,因此最终用户不必手动进行映射,而是自定义注释的作者。所以这就是我最终尝试的。

知道如何克服这个限制吗?

4

1 回答 1

0

这并不能真正解决问题,但却是一个不错的选择。

正如我的帖子中所见,我已经将元注释定义@Validate为我的验证框架的标记。我还有一个接口(lambda 表达式实际使用的接口)ValidateCallback

有了这些,我只需要添加value()一个@Validate

public @interface Validate {
    Class<? extends ValidateCallback> value();
}

现在我可以放弃我之前使用的“注册”系统。我所要做的就是调用链接的功能接口。

于 2017-02-24T02:13:14.940 回答