2012-10-11 17 views
6

Java kullanarak bir ek açıklama işlemci yazmayı deniyorum. Bu ek açıklama işlemcisinin, aşağıda görüldüğü gibi açıklamalı bir sınıf içerisindeki açıklamalı iç içe geçmiş sınıfları tanımlaması gerekir. Önce açıklamalı dersleri işleyeceğim ve içsel açıklamalarını işleyeceğim. Bu derleme zamanında yapılır ve işlenen sınıf hakkında mevcut bilgim olmaz. Foo'da çoklu iç içe geçmiş sınıflara sahip olmak mümkündür. Tüm bu iç içe geçmiş sınıfların açıklamalarını nasıl işleyebilirim.APT Yuvalanmış açıklamalı sınıfların ek açıklamaları nasıl işlenir

@MyAnnotation(value="Something important") 
public class Foo 
{ 
    private Integer A; 

    @MyMethodAnnotation(value="Something Else") 
    public Integer getA() { return this.A; } 

    @MyAnnotation(value="Something really important") 
    private class Bar 
    { 
     private Integer B; 

     @MyMethodAnnotation(value="Something Else that is very Important") 
     public Integer getB() { return this.B }  
    } 
} 

nasıl işleme sırasında, bu açıklama 'MyAnnotation' var ve onun 'MyMethodAnnotation' iç içe Bar sınıfına erişebilirsiniz? Aşağıdaki kod yalnızca Foo sınıfı hakkında bilgi yazdırır. Bar hakkındaki bilgileri nasıl işleyebilirim?

for (Element element : env.getElementsAnnotatedWith(MyAnnotation.class)) { 
    if (element.getKind().equals(ElementKind.CLASS)) 
    { 
     System.out.println(element.getKind().name() + " " + element.getSimpleName()); 
     processInnerClassElement(element); 
    } 
    else 
    { 
     System.out.println(element.getKind().name() + " " + element.getSimpleName()); 
    }  
} 

... 


private void processInnerClassElement(Element element) 
{ 
    for (Element e : element.getEnclosedElements()) 
    { 
     if (e.getKind().equals(ElementKind.CLASS)) 
     { 
      System.out.println(e.getKind().name() + " " + e.getSimpleName()); 
      processInnerClassElement(e); 
     } 
     else 
     { 
      System.out.println(e.getKind().name() + " " + e.getSimpleName() ); 
     } 
    } 
} 
+0

I (Eleman e: env.getElementsAnnotatedWith (EmfInfo.class)) için kullanarak iç içe sınıf Bar unsurunu erişen deneyin { ama bu sadece dış çoğu sınıf Foo döndürür. – sholmes

cevap

0

Ben bu açıklama birbirini nasıl ilişkilendirildiğini bağlıdır tahmin Burada hızlı bir örnektir. Aksi İstediğinizi elde etmek için element.getEnclosedElements() ve element.getEnclosingElement() kullanmak mümkün olabilir

for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) { 
    MyAnnotation myAnnotation = element.getAnnotation(MyAnnotation.class); 
    if (myAnnotation != null) { 
     doSomething(myAnnotation, element); 
    } 
} 

for (Element element : roundEnv.getElementsAnnotatedWith(MyMethodAnnotation.class)) { 
    MyMethodAnnotation myMethodAnnotation = element.getAnnotation(MyMethodAnnotation.class); 
    if (myMethodAnnotation != null) { 
     doSomething(myMethodAnnotation, element); 
    } 
} 

:

Sadece gibi süreç yönteminde çeşitli blokları @SupportedAnnotationTypes tüm açıklamaları beyan ve olabilir.

+0

Bu mükemmel bir şekilde çalıştı. Kaynağımda, hatalara neden olan bir problemim vardı. Bu düzeltilmiş ile yukarıdaki çözüm, iç içe geçmiş sınıfın ek açıklamalarını işledi. – sholmes

-1

Sen özellikle bu yöntemleri Foo ilan sınıfları, bu sınıflara ek açıklamaları, bu sınıflara ilan yöntemleri ve açıklamaları almak için, bunu yapmak için Class ve Method birkaç yöntemleri gerekir .

public static void main(String... args) { 
    for (Class<?> declaredClass : Foo.class.getDeclaredClasses()) { 
     MyAnnotation myAnnotation = declaredClass.getAnnotation(MyAnnotation.class); 
     // Process value of class annotation here 
     for (Method method : declaredClass.getDeclaredMethods()) { 
      MyMethodAnnotation myMethodAnnotation = method.getAnnotation(MyMethodAnnotation.class); 
      // Process value of method annotation here 
     } 
    } 
} 

Java ile yansıma belgelerine okumaya anlayışlı olabilir: http://docs.oracle.com/javase/tutorial/reflect/index.html

+3

Yansıma API'sı hakkında konuşuyorsunuz. OP ek açıklama işlemcisi hakkında sordu. Bu yansıma değil. Java derleyicisine bir çeşit uzantı olan başka bir API'dır. – AlexR

+0

Açıklamalama Aracı'nı Java6'da bir derleyicinin uzantısı olarak kullanıyorum. Ben derleme zamanında Ek Açıklama İşleme Aracı'nı kullanarak dosyaları işlerken yuvalanmış sınıf isimlerini bilmiyorum. – sholmes