使用注释处理器向类型添加属性

时间:2014-04-30 21:41:46

标签: java annotations

我正在尝试编写一个应该在编译期间运行的注释处理器。 它将首先检查一个特定的字段(int id)是否存在于给定的类中(编译后),如果不存在,则应该添加该字段(如果可能的话,初始值为-1)。 我想我要编辑TypeElement。 我可以在类文件中的一行中插入一个字符串吗?

processingEnd.getFilter().getResource(...)似乎给了我这个文件,但我不确定如何 执行此操作并正确指定参数。我可以得到一个读写流,但我不完全确定我是否可以简单地在课堂上的某一行“插入”我想要的内容。

@Override
public boolean process(Set<? extends TypeElement> set,
                       RoundEnvironment round) {
    if (!set.contains(DBStorable.class)) {
        return false;
    }
    Set<? extends Element> elements =
            round.getElementsAnnotatedWith(DBStorable.class);
    for (Element element : elements) {
        if (element.getKind() == ElementKind.CLASS) {
            // edit processed class to include id field.
            TypeElement processedType = (TypeElement) element;
            boolean found = false;
            for (Element subElement : processedType.getEnclosedElements()) {
                if (subElement.getKind() == ElementKind.FIELD
                        && subElement.getSimpleName().equals("id")) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                // This is where I don't get on...
                JavaFileObject javaFile = processingEnv.getFiler().getResource(
                        Location, // <- not sure how to get this.
                        processingEnv.getElementUtils().getPackageOf(processedType),
                        processedType.getSimpleName()); // <- is this the right value?

                // ... tbc
            }
        }
    }
    // TODO Auto-generated method stub
    return true;
}

1 个答案:

答案 0 :(得分:2)

在处理过程中,您不应该更改任何类。查看Filer类的文档:

  

通常,处理器不得故意尝试覆盖某些处理器未生成的现有文件。

但是,您可以创建覆盖现有方法或添加新属性的子类:

  

请注意,使用装饰器样式模式可以实现覆盖文件的一些效果。不是直接修改类,而是设计类,以便通过注释处理生成其超类,或者通过注释处理生成类的子类。如果生成了子类,则可以将父类设计为使用工厂而不是公共构造函数,以便只将子类实例呈现给父类的客户端。

如果这不是您的选择,请继续寻找其他工具或解决方法。例如,在这个问题中可能会有一些解决方案:Plugging in to Java compilers