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

Java 使用注释处理器向类型添加属性,java,annotations,Java,Annotations,我正在尝试编写一个注释处理器,该处理器应该在编译期间运行。 它将首先检查给定类(编译后)中是否存在特定字段(int-id),如果不存在,则应添加此字段(如果可能,初始值为-1)。 我想我有要编辑的TypeElement。 例如,我可以在类文件的一行中插入一个字符串吗 processingEnd.getFilter().getResource(…)似乎给了我这个文件,但我不确定如何给我 我可以得到一个读写流,但我不能完全确定是否可以简单地在类中的某一行“插入”我想要的内容 @Override pu

我正在尝试编写一个注释处理器,该处理器应该在编译期间运行。 它将首先检查给定类(编译后)中是否存在特定字段(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;
}
@覆盖

公共布尔进程(Set在处理过程中不应更改任何类。请查看该类的文档:

一般来说,处理器不得有意覆盖并非由某些处理器生成的现有文件

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

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


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

最终我得出了相同的结论。毕竟不需要注入字段,但定期操作会带来更好的解决方案。