2011-12-05 2 views
4

기존 "프로토 타입"클래스를 기반으로 새로운 클래스를 생성하는 주석 프로세서를 구현하고 싶습니다.Java 정적 메타 프로그래밍

import java.util.List 

@MyAnnotation 
class MySuperClassPrototype { 
    static MySuperClassPrototype createInstance() { 
     return new MySuperClassPrototype(); 
    } 
} 

아래 코드의 결과. 다음과 같은 새로운 소스 파일 (컴파일 단위)가 생성됩니다

import java.util.List 

class MySuperClass { 
    static MySuperClass createInstance() { 
     return new MySuperClass(); 
    } 
    public void specialAddedMethod() { 
     /*...*/ 
    } 
} 

나는 모든 최상위 import 문 및 정적 회원들과 프로토 타입 수준이 아닌 정적 멤버를 복사하고 싶습니다. 필자는 Compiler Tree API (com.sun.source.tree)로 꽤 이동했습니다. 이전 클래스에 새 클래스 이름을 대체하면서 Tree 데이터 유형을 인쇄 할 수 있습니다. 하지만 꽤 어려워 보이는 문제가 있습니다.

트리에서 Tree.Kind.IDENTIFIER를 얻으면 참조하는 실제 클래스를 어떻게 찾을 수 있습니까? MySuperClassPrototype 식별자의 모든 항목을 MySuperClass 식별자로 바꾸고 전체 트리를 인쇄해야합니다.

실현 가능합니까?

마찬가지로 @MyAnnotation 주석을 필터링해야하며 다시 Tree.Kind.IDENTIFIER 또는 Tree.Kind.MEMBER_SELECT로 표시됩니다.

이 식별자로 참조되는 실제 주석 클래스를 어떻게 확인할 수 있습니까?

또 다른 문제는 트리를 인쇄하는 것입니다. toString 메서드를 사용하면 괜찮은 결과를 얻었지만 생성자는 클래스와 동일한 이름의 메서드 대신 "<init>"이라는 메서드로 인쇄되므로 모든 종류의 Tree 노드를 수동으로 인쇄해야합니다.

당신은 code I've come with here

답변

4

네, 가능을 볼 수 있고 나는 적어도 2 가지 방법을 알고있다.

첫째, "전통적인"방법은 주어진 파일 경로를 검색하고 Class.forName(className).getAnnotations(MyAnnotation.class)과 같은 각 클래스를 호출하는 ant task/maven plugin/just 명령 줄 java 유틸리티를 작성하는 것입니다. 이것이 널이 아니라면, 리플렉션을 사용하여 클래스를 발견하고 필요한 것을하십시오.

다른 방법은 조금 더 어렵지만 더 강력합니다. 당신은 구현할 수 있습니다 자신의 Processor (즉 javax.annotation.processing.Processor를 구현하거나 더 나은 javax.annotation.processing.AbstractProcessor. 당신의 프로세서가 바로 compiler 클래스 경로에 배치해야합니다 및 컴파일러가. 당신도 당신의 IDE (예 : Eclipse를) 구성 할 수 있습니다 실행시 자동으로 실행됩니다 확장 귀하의 프로세서를 실행하십시오. 자바 컴파일러의 확장 기능입니다. 이클립스가 프로젝트를 빌드 할 때마다 프로세서를 실행하고 추가 한 새로운 주석에 따라 새로운 클래스를 새로 만듭니다.

project

0

https://github.com/rzwitserloot/lombok/에서 살펴보면 다음과 같은 방법을 추가 할 수 있습니다. 너는 설명했다.

  • @Setter
  • @ToString 필드에 기재 toString() 방법을 추가 필드에 기초 게터 수단을 추가 @Getter 같은