2014-09-18 8 views
0

주석 처리기를 사용하여 주석 처리되는 클래스의 기본 클래스를 생성하려고합니다. 다음과 같이 입력하십시오 :Java Annotation Processor를 통해 기본 클래스 만들기

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

또는 가장, 당신은 당신의 요구 사항을 분석하고 이러한 요구 사항을 만족하는지 확인해야 할 것 : 여기에서 기본 작업 프로세서입니다.

관련 문제