2012-04-20 1 views
3

필자는 인터넷에서 여러 개의 Annotation Processing Tool (APT) 가이드 (예 : 12)를 사용하여 컴파일러/빌드 시간에 작동하도록했으며 Eclipse에서도 작동하도록했습니다.런타임시 Annotation Processing API는 어떻게 사용합니까?

내 주석을 사용하여 유형 (클래스) 목록을 얻으려면 런타임에 APT를 사용할 수있는 방법이 있습니까?

@SupportedAnnotationTypes("com.domain.MyAnnotation") 
public class MyAbstractProcessor extends AbstractProcessor { 

    public static Map<Element, MyAnnotation> patches = new HashMap<Element, MyAnnotation>(); 

    @Override 
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) { 

     // Get all classes that has the annotation 
     Set<? extends Element> classElements = roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class); 

     // For each class that has the annotation 
     for (final Element classElement : classElements) { 

      patches.put(classElement, annotation); 

것은 그래서 MyAbstractProcessor.patches는 주석을 사용하여 클래스의 목록을 채울 것 :

내가 좋아하는 뭔가를 썼다. 이 APT가 빌드시에 실행되고 있으며 실행 시간이 아니라는 단점을 제외하고 고상한 아이디어.

런타임에 APT를 사용할 수 있습니까?

또는 내가 원하는 것을 얻기 위해 잘못된 프레임 워크를 사용하고 있습니까?

답변

4

반사를 사용하여 런타임에 주석에 액세스 할 수 있습니다 - getAnnotations.

주석을 사용하여 (클래스 경로에서) 클래스 목록을 얻으려면 런타임에 주석이 있는지 모든 클래스 테스트를 반복 할 수 있습니다.

또는 빌드 타임에 클래스 목록을 사용하여 클래스를 구성 할 수 있습니다.

+0

"또는 빌드 타임에 클래스 목록을 사용하여 클래스를 구성 할 수 있습니다." - 런타임에 응용 프로그램에서 읽는 파일로 출력한다는 의미입니까? – corgrath

+0

예,'processingEnv.getFiler(). createSourceFile (qualifiedName) .openWriter()'를 사용하고 패치 내용을'qualifedName' 클래스의 정적 변수에 씁니다. 물론 모든 필수 클래스를 작성해야합니다. 보일러 플레이트'public class simpleName {private static final Map < > patches = new map < > {패치 내용} ... – emory

+0

와우, createSourceFile은 훌륭합니다. 나는 그것이 가능하다는 것을 몰랐다. 감사합니다 :-) – corgrath

1

RetentionPolicy을 사용하여 런타임에 주석을 사용할 수 있다고 지정 했습니까? 당신이 @Retention 주석을 사용할 필요가 없다면.

@Retention(RetentionPolicy.RUNTIME) 

public @interface MyAnnotation { 
    String[] parameters(); 
    String[] exceptions(); 
} 
+0

예, 했어요. SOURCE 및 RUNTIME :-) – corgrath

+0

일반적으로이 보존 정책으로 작동해야합니다. APT에서 작동하지 않는 경우 JSR 269 (Pluggable Annotations Processing)를 사용해보십시오. – zeropouet