2014-09-18 67 views
0

我想使用注释处理器来生成要注释的类的基类。就像这样:通过Java注释处理器创建基类

@ClassGenerator(name="FakeClass") // Generates FakeClass 
public class MyClass extends FakeClass { 
    ... 
} 

这可能吗?或者我应该看看其他模式。

+0

只是好奇:为什么? – Fildor 2014-09-18 18:04:35

+0

@Fildor这将使我必须建立更优雅的班级。我需要能够覆盖生成的类中的东西。我的选择是将其分解:1个类定义需要生成的内容,另一个类来自具有所有覆盖的类。 – Hounshell 2014-09-18 18:11:30

+0

@afzalex处理器生成的类可以替换现有的类定义吗?我的印象是它不能。 – Hounshell 2014-09-18 18:12:27

回答

0

要直接回答问题......当然,您只需要扫描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; 
    } 
} 

至于如果这个图案是可取还是最好的,你必须分析你的要求,并确定这是否满足您的需求。