首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证静态变量的运行时注释

验证静态变量的运行时注释
EN

Stack Overflow用户
提问于 2015-09-01 10:38:29
回答 1查看 343关注 0票数 1

我想要创建一个自定义注释,当在方法上使用它时,将检查某个静态变量是否有效。否则将引发异常。

,例如:

代码语言:javascript
运行
复制
@IDCheck
public void someMethod() {
    //code...
}

它检查作为全局变量存储的ID。它不应该为null,并且该值必须符合某些规则。由于这个ID在运行时不断更改,所以我希望在运行时使用一个注释来验证它。

我尝试了什么:

代码语言:javascript
运行
复制
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * Checks for a valid ID.
 * <p>
 * This is a marker annotation and it has no specific attributes.
 */
@Target(METHOD)
@Retention(RUNTIME)
public @interface IDCheck {
}

当调用带有@IDCheck注释的方法时,我不确定如何在运行时进行验证。

尝试过这样的方法:

代码语言:javascript
运行
复制
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.TypeElement;
import javax.lang.model.SourceVersion;

@SupportedAnnotationTypes("IDCheck")
public class IDCheckProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> arg0,
            RoundEnvironment roundEnv) {
        if(!Util.isIDValid()){
            //Throw an exception.
            return true;
        }
        return false;
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }
}

但是process方法中的代码从未被调用。

EN

回答 1

Stack Overflow用户

发布于 2015-09-01 10:50:24

如果您想在运行时检查这一点,则不需要使用注释处理器。

我建议您使用代理和一个小的反射来实现它。您已经定义了注释。您需要做的是为要检查和注释方法声明的组件创建一个接口。

代码语言:javascript
运行
复制
public interface MyInterface {

    @IDCheck
    void someMethod();    

}

然后使用Java的动态代理创建接口的代理:

代码语言:javascript
运行
复制
MyInterface  instance = Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
            new Class[]{MyInterface}, handler);

这里最重要的是第三个参数--这是一个InvocationHandler。每次调用代理的方法时,都会通知它。您应该覆盖它的invoke()方法,并在那里实现您的验证。就像这样:

代码语言:javascript
运行
复制
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
    if (method.isAnnotationPresent(IDCheck.class)) {
        //proceed with navigation and throw exception if invalid
    }

    // delegate the method execution to a wrapped implementor of the MyInterface
}

这是保证在运行时工作。它的性能影响不是很大,这是不太可能的,甚至是显而易见的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32329499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档