Java 使用注释处理器向类型添加属性
我正在尝试编写一个注释处理器,该处理器应该在编译期间运行。 它将首先检查给定类(编译后)中是否存在特定字段(int-id),如果不存在,则应添加此字段(如果可能,初始值为-1)。 我想我有要编辑的Java 使用注释处理器向类型添加属性,java,annotations,Java,Annotations,我正在尝试编写一个注释处理器,该处理器应该在编译期间运行。 它将首先检查给定类(编译后)中是否存在特定字段(int-id),如果不存在,则应添加此字段(如果可能,初始值为-1)。 我想我有要编辑的TypeElement。 例如,我可以在类文件的一行中插入一个字符串吗 processingEnd.getFilter().getResource(…)似乎给了我这个文件,但我不确定如何给我 我可以得到一个读写流,但我不能完全确定是否可以简单地在类中的某一行“插入”我想要的内容 @Override pu
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在处理过程中不应更改任何类。请查看该类的文档:
一般来说,处理器不得有意覆盖并非由某些处理器生成的现有文件
但是,您可以创建覆盖现有方法或添加新属性的子类:
请注意,覆盖文件的某些效果可以通过使用装饰器样式模式来实现。该类不是直接修改类,而是通过注释处理生成其超类,或者通过注释处理生成该类的子类。如果生成子类,则父类类可以被设计为使用工厂而不是公共构造函数,这样只有子类实例才会呈现给父类的客户端
如果这不是您的选择,请继续寻找其他工具或解决方法。例如,在这个问题上可能有一些解决方案:最终我得出了相同的结论。毕竟不需要注入字段,但定期操作会带来更好的解决方案。