2012-10-11 12 views
6

मैं जावा का उपयोग करके एक एनोटेशन प्रोसेसर लिखने की कोशिश कर रहा हूं। इस एनोटेशन प्रोसेसर को नीचे बताए गए एनोटेटेड क्लास के भीतर एनोटेटेड नेस्टेड क्लास की पहचान करने की आवश्यकता है। मैं पहले एनोटेटेड कक्षाओं को संसाधित करूंगा और फिर अपनी आंतरिक टिप्पणियों को संसाधित करूंगा। यह संकलन समय पर किया जाता है और मेरे पास कक्षा के संसाधित होने का कोई मौजूदा ज्ञान नहीं होगा। फू के भीतर कई घोंसला वाले वर्ग होना संभव है। मैं इन सभी घोंसले वर्गों की टिप्पणियों को कैसे संसाधित करूं?एपीटी नेस्टेड एनोटेटेड कक्षाओं की टिप्पणियों को कैसे संसाधित करें

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

मैं कैसे प्रसंस्करण के दौरान, यह एनोटेशन 'MyAnnotation' है और उसके 'MyMethodAnnotation' नेस्टेड बार वर्ग के लिए उपयोग कर सकते हैं? निम्नलिखित कोड केवल कक्षा फू के बारे में जानकारी प्रिंट करता है। मैं बार के बारे में जानकारी कैसे संसाधित कर सकता हूं?

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

मैं के लिए (तत्व ई: env.getElementsAnnotatedWith (EmfInfo.class)) का उपयोग कर नेस्टेड वर्ग बार पर एक तत्व पहुंच बनाने का प्रयास { लेकिन यह केवल सबसे बाहरी वर्ग फू देता है। – sholmes

उत्तर

0

मैं इसे निर्भर करता है कि कैसे इन एनोटेशन एक दूसरे से संबंधित लगता है कि यहां एक त्वरित उदाहरण है।

आप बस सभी एनोटेशन @SupportedAnnotationTypes में कई ब्लॉकों की तरह प्रक्रिया-विधि में घोषित करने और हो सकता है:

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

नहीं तो आप element.getEnclosedElements() और element.getEnclosingElement() उपयोग करने के लिए प्राप्त करने के लिए आप क्या चाहते हैं सक्षम हो सकता है।

+0

यह पूरी तरह से काम किया। मुझे वास्तव में मेरे स्रोत में एक समस्या थी जो मुझे त्रुटियों का कारण बना रहा था। इसके साथ उपरोक्त समाधान को नेस्टेड कक्षा की टिप्पणियों को संसाधित किया गया। – sholmes

-1

आप Class और Method से कुछ तरीकों की जरूरत है यह करने के लिए होगा, विशेष रूप से उन तरीकों पर कक्षाएं Foo में घोषणा की, उन वर्गों पर एनोटेशन, तरीकों उन कक्षाओं में घोषणा की, और एनोटेशन प्राप्त करने के लिए ।

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

यह जावा में प्रतिबिंब के बारे में दस्तावेज़ के माध्यम से पढ़ने के लिए व्यावहारिक हो सकता है:: http://docs.oracle.com/javase/tutorial/reflect/index.html

+3

आप प्रतिबिंब एपीआई के बारे में बात कर रहे हैं। ओपी ने एनोटेशन प्रोसेसर के बारे में पूछा। यह प्रतिबिंब नहीं है। यह अन्य एपीआई है जो जावा कंपाइलर के लिए एक प्रकार का विस्तार है। – AlexR

+0

मैं एनोटेशन प्रोसेसिंग टूल का उपयोग जावा 6 में अनुपालन का विस्तार कर रहा हूं। मैं नेस्टेड क्लास नामों को नहीं जानता, जबकि मैं संकलन समय पर एनोटेशन प्रोसेसिंग टूल का उपयोग कर फाइलों को संसाधित कर रहा हूं। – sholmes

संबंधित मुद्दे