我想创建一个自定义注释,当在方法上使用时,将检查某个静态变量是否有效。如果不是会抛出异常。
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
方法中的代码永远不会被调用。
答案 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);
这保证在运行时工作。性能影响不是很大,甚至不太可能引人注意。