0
我想使用註釋處理器來生成要註釋的類的基類。就像這樣:通過Java註釋處理器創建基類
@ClassGenerator(name="FakeClass") // Generates FakeClass
public class MyClass extends FakeClass {
...
}
這可能嗎?或者我應該看看其他模式。
我想使用註釋處理器來生成要註釋的類的基類。就像這樣:通過Java註釋處理器創建基類
@ClassGenerator(name="FakeClass") // Generates FakeClass
public class MyClass extends FakeClass {
...
}
這可能嗎?或者我應該看看其他模式。
要直接回答問題......當然,您只需要掃描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;
}
}
至於如果這個圖案是可取還是最好的,你必須分析你的要求,並確定這是否滿足您的需求。
只是好奇:爲什麼? – Fildor 2014-09-18 18:04:35
@Fildor這將使我必須建立更優雅的班級。我需要能夠覆蓋生成的類中的東西。我的選擇是將其分解:1個類定義需要生成的內容,另一個類來自具有所有覆蓋的類。 – Hounshell 2014-09-18 18:11:30
@afzalex處理器生成的類可以替換現有的類定義嗎?我的印象是它不能。 – Hounshell 2014-09-18 18:12:27