首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用元批注触发批注处理器

使用元批注触发批注处理器
EN

Stack Overflow用户
提问于 2012-10-02 19:59:40
回答 1查看 808关注 0票数 4

我已经构建了一个由com.foo.FooEntity批注触发的批注处理器。需要能够创建更多的构造型,这些构造型也会触发注释处理器。

例如,控制器也应该触发这个批注处理器。我想知道是否有一种方法可以在上面放置@FooEntity注释。类似于:

代码语言:javascript
运行
复制
@FooEntity
@Target(TYPE)
@Retention(RUNTIME)
public @interface Controller {}

并使用它,以便该类触发批注处理

代码语言:javascript
运行
复制
@Controller
public class MyController { ... }

当然,这里的想法是我希望添加新的构造型,而不必接触批注处理器本身。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 18:20:24

我不认为有一种方法可以配置处理器来处理带有@FooEntity@FooEntity和批注meta-annotated (在本例中是@Controller)。相反,您可以有一个支持任何批注的处理器(@SupportedAnnotationTypes("*")),然后在处理器本身中实现一些进一步的逻辑,以便决定您想要处理哪些批注。这是一个基于我对问题的理解的实现:

代码语言:javascript
运行
复制
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;
        }
    }

}

示例运行将为您提供以下信息:

代码语言:javascript
运行
复制
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]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12689807

复制
相关文章

相似问题

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