我正在尝试编写一个应该在编译期间运行的注释处理器。
它将首先检查一个特定的字段(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;
}
答案 0 :(得分:2)
在处理过程中,您不应该更改任何类。查看Filer类的文档:
通常,处理器不得故意尝试覆盖某些处理器未生成的现有文件。
但是,您可以创建覆盖现有方法或添加新属性的子类:
请注意,使用装饰器样式模式可以实现覆盖文件的一些效果。不是直接修改类,而是设计类,以便通过注释处理生成其超类,或者通过注释处理生成类的子类。如果生成了子类,则可以将父类设计为使用工厂而不是公共构造函数,以便只将子类实例呈现给父类的客户端。
如果这不是您的选择,请继续寻找其他工具或解决方法。例如,在这个问题中可能会有一些解决方案:Plugging in to Java compilers