Ste*_*oll 4 java annotations annotation-processing
我已经建立了一个通过注释触发的注释处理器com.foo.FooEntity。有必要能够创建更多的构造型,以触发该注释处理器。
例如,控制器还应该触发此注释处理器。我想知道是否有一种方法可以@FooEntity在上面放置注释。就像是:
@FooEntity
@Target(TYPE)
@Retention(RUNTIME)
public @interface Controller {}
Run Code Online (Sandbox Code Playgroud)
并使用它,以便此类触发注释处理
@Controller
public class MyController { ... }
Run Code Online (Sandbox Code Playgroud)
当然,这里的想法是我想添加新的构造型,而不必接触注释处理器本身。
我不认为有可配置的处理器,处理的方式@FooEntity以及注释元注解与@FooEntity(@Controller在这种情况下)。相反,您可以做的是拥有一个支持任何注释(@SupportedAnnotationTypes("*"))的处理器,然后在处理器本身内实现一些其他逻辑,以便确定您要处理的注释。根据我对问题的理解,这是一个这样的实现:
package acme.annotation.processing;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.TypeElement;
import acme.annotation.FooEntity;
@SupportedAnnotationTypes("*")
public class FooEntityExtendedProcessor extends AbstractProcessor {
private void log(String msg) {
System.out.println(msg);
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
log("Initially I was asked to process:" + annotations.toString());
Set<TypeElement> fooAnnotations = new HashSet<>();
for (TypeElement elem : annotations) {
if (isFoo(elem)) fooAnnotations.add(elem);
}
if (fooAnnotations.size() > 0) {
log("... but I am now going to process:" + fooAnnotations.toString());
processInternal(fooAnnotations, roundEnv);
} else {
log("... but none of those was my business!");
}
// always return false so that other processors get a chance to process the annotations not consumed here
return false;
}
private void processInternal(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// TODO: do your foo processing here
}
private boolean isFoo(TypeElement elem) {
if (elem.getQualifiedName().toString().equals("acme.annotation.FooEntity")
|| elem.getAnnotation(FooEntity.class) != null) {
return true;
} else {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
样本运行将为您提供:
Initially I was asked to process:[acme.annotation.FooEntity, skriptor.annotation.ScriptArg, java.lang.Override, skriptor.annotation.ScriptCodeRT, skriptor.annotation.ScriptCode, skriptor.annotation.ScriptObject, javax.ws.rs.Path, javax.ws.rs.GET, acme.annotation.Controller, com.sun.jersey.spi.resource.Singleton, skriptor.annotation.ScriptImport, javax.ws.rs.ext.Provider, javax.ws.rs.Produces, javax.annotation.PostConstruct]
... but I am now going to process:[acme.annotation.Controller, acme.annotation.FooEntity]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
655 次 |
| 最近记录: |