【问题标题】:Create a Base Class via Java Annotation Processor通过 Java 注释处理器创建基类
【发布时间】:2014-09-18 18:02:03
【问题描述】:

我想使用注释处理器来生成被注释类的基类。像这样的:

@ClassGenerator(name="FakeClass") // Generates FakeClass
public class MyClass extends FakeClass {
    ...
}

这可能吗?或者我应该看看其他模式。

【问题讨论】:

  • @Fildor 这将使我必须构建的类更加优雅。我需要能够覆盖生成的类中的东西。我的替代方法是将其拆分:1 个类定义需要生成的内容,第二个类派生自具有所有覆盖的类。
  • @afzalex 处理器生成的类可以替换现有的类定义吗?我的印象是它不能。
  • 对不起!我不明白你的问题。能不能说的更清楚一点。
  • 这样更好吗?我正在尝试生成班级自己的超级班级。具体看代码sn-p的注释。
  • 但是你为什么需要超类呢?你不可能在其他地方使用它?

标签: java annotations annotation-processing


【解决方案1】:

直接回答问题...当然,您只需要扫描ClassGenerator 并生成缺失的类。这是一个基本的工作处理器:

@SupportedAnnotationTypes("ClassGenerator")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class BaseClassProcessor extends AbstractProcessor {

    private Elements elements;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        elements = processingEnv.getElementUtils();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(ClassGenerator.class)) {
            TypeMirror mirror = ((TypeElement) element).getSuperclass();

            PackageElement pacakgeElement = elements.getPackageOf(element);
            String packageName = pacakgeElement.getQualifiedName().toString();
            String superClassName = ((DeclaredType) mirror).asElement().getSimpleName().toString();

            try {
                Writer file = processingEnv.getFiler().createSourceFile(packageName + "." + superClassName).openWriter();
                file.write(String.format("package %s; public class %s {}", packageName, superClassName));
                file.flush();
                file.close();
            } catch (IOException ex) {
                Logger.getLogger(BaseClassProcessor.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return true;
    }
}

至于这种模式是否可取或最佳,您必须分析您的需求并确定这是否满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多