运行时注释以验证静态变量

时间:2015-09-01 10:38:30

标签: android annotations

我想创建一个自定义注释,当在方法上使用时,将检查某个静态变量是否有效。如果不是会抛出异常。

e.g:

@IDCheck
public void someMethod() {
    //code...
}

检查ID,存储为全局变量。它不应该为null,并且值必须符合某些规则。 由于此ID在运行时不断变化,因此我想在运行时使用注释对其进行验证。

我尝试了什么:

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注释的方法时,我不确定如何在运行时进行验证。

尝试过这样的事情:

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方法中的代码永远不会被调用。

1 个答案:

答案 0 :(得分:0)

如果要在运行时检查此项,则无需使用注释处理器。

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

8/26/2015 13:13:13

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

public interface MyInterface {

    @IDCheck
    void someMethod();    

}

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

MyInterface  instance = Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
            new Class[]{MyInterface}, handler);

这保证在运行时工作。性能影响不是很大,甚至不太可能引人注意。