2014-09-18 2 views
0

Я хочу использовать обработчик аннотации для генерации базового класса аннотированного класса. Что-то вроде этого:Создайте базовый класс через обработчик аннотации Java

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

Возможно ли это? Или я должен смотреть на другие шаблоны.

+0

Просто любопытно: почему? – Fildor

+0

@Fildor Это сделало бы класс, который я должен построить более элегантно. Мне нужно переопределить материал в сгенерированном классе. Моей альтернативой было бы разделить его: 1 класс, который определяет, что нужно сгенерировать, второй класс, который происходит от этого класса, который имеет все переопределения. – Hounshell

+0

@afzalex Может ли класс, сгенерированный процессором, заменить существующее определение класса? У меня создалось впечатление, что это невозможно. – Hounshell

ответ

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; 
    } 
} 

Как для если это скороговорка желательно или лучше, вы должны проанализировать ваши требования и определить, если это удовлетворяет ваши потребности.

Смежные вопросы