2011-09-11 4 views
2

주석 처리기는 두 개의 TypeElement을 제공합니다. 하나는 주석 처리 된 개체 용이고 다른 하나는 주석 자체입니다.코드 생성을 위해 주석 처리 중 주석 처리 된 클래스 유형을 검색하는 방법은 무엇입니까?

코드를 생성하기 위해 주석 처리 중에 주석 처리 된 객체의 유형을 알아야한다고 가정 해 봅시다. 규정 된 이름은 TypeElement.getQualifiedName()으로 추출 할 수 있습니다. 그러나 Class.forName(fullyQualifiedName)을 사용하려는 시도는 ClassNotFoundException입니다.

아마 클래스가 주석 처리 코드의 경로에 있지 않음을 의미합니다. 주석 처리 중에 주석 처리 된 코드를 처리 라이브러리의 클래스 경로에 둘 필요없이 이러한 클래스를 검색 할 수 있습니까?

해결 방법은 같은 것을 생성하는 것입니다 : 대신 생성 된 코드에서

Class c = Class.forName("thefullyqualifiedname"); 

및 사용에 c하지만 깨끗하지 않습니다. 내가 가지고 올 수

답변

0

가장 좋은 해결 방법은 다음과 생산

JClass annotatedType = jcmSource.ref(Class.class); 

    JInvocation m = annotatedType.staticInvoke("forName"); 
    m.arg(fa.getAnnotated().toString()); 

    JFieldVar field = sourceClass.field(
      JMod.PRIVATE | JMod.STATIC, annotatedType, "c"); 

    JBlock staticInit = sourceClass.init(); 

    JTryBlock tb = staticInit._try(); 
    JBlock jbtb = tb.body(); 
     jbtb.assign(field, m); 
    tb._catch(jcmSource.ref(ClassNotFoundException.class)); 

: 그것은 주석 클래스의 클래스 형식으로 명시 적으로 액세스 권한을 부여하지 않습니다

private static Class c; 

static { 
    try { 
     c = Class.forName("net.codegentest.CodeGenTest"); 
    } catch (ClassNotFoundException _x) { 
    } 
} 

만에 최소한 코드에서 생성 될 수 있습니다.

4

주석 처리가 발생할 때 주석 처리 된 클래스의 "클래스"객체를 사용할 수 없다는 것은 매우 정상적인 것처럼 보입니다. 컴파일 시간에 발생하기 때문입니다. 이것이 TypeElements와 TypeMirrors가있는 이유입니다. Class 객체와 완전히 동일합니다.

주석에서 지적했듯이 어노테이션은 클래스 경로에있는 클래스 객체에만 액세스 할 수 있습니다. 주석 처리 된 클래스의 경우가 아닙니다. 컴파일되고 있기 때문입니다.

클래스 대신 문자열 한정자를 사용하는 것이 좋지 않다고 생각합니다. 실제로 TypeElement & TypeMirror ;-)를 사용해야합니다.

어떤 이유로 Class 객체가 필요합니까? TypeElement & TypeMirror를 사용하여 무엇이든 할 수 있다고 확신합니다.

+0

생성 된 코드를 통해 구조 (즉, 집합)에 주석이 달린 클래스 유형을 등록해야합니다. 자동화되어야합니다. 따라서 어노테이션 처리 중에 어쨌든 검색/액세스해야합니다. – JVerstry

+0

annotated 인터페이스를 구현하는 클래스를 가져 오려고합니다.이 목적을 위해 Reflections 클래스는 Class 객체를 필요로합니다 :'getSubTypesOf()'. 하위 유형을 찾거나 구현 된 인터페이스에서 주석을 찾을 수있는 다른 방법을 찾지 못했습니다. –