我想要创建一个自定义注释,当在方法上使用它时,将检查某个静态变量是否有效。否则将引发异常。
,例如:
@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方法中的代码从未被调用。
发布于 2015-09-01 10:50:24
如果您想在运行时检查这一点,则不需要使用注释处理器。
我建议您使用代理和一个小的反射来实现它。您已经定义了注释。您需要做的是为要检查和注释方法声明的组件创建一个接口。
public interface MyInterface {
@IDCheck
void someMethod();
}然后使用Java的动态代理创建接口的代理:
MyInterface instance = Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
new Class[]{MyInterface}, handler);这里最重要的是第三个参数--这是一个InvocationHandler。每次调用代理的方法时,都会通知它。您应该覆盖它的invoke()方法,并在那里实现您的验证。就像这样:
@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
}这是保证在运行时工作。它的性能影响不是很大,这是不太可能的,甚至是显而易见的。
https://stackoverflow.com/questions/32329499
复制相似问题