2011-07-13 14 views
23

के साथ एकीकृत करना मैं एक नई एनोटेशन बनाने की कोशिश कर रहा हूं जिसके साथ मैं कुछ रनटाइम तारों को करूँगा, लेकिन, कई कारणों से, मैं संकलन समय पर सत्यापित करना चाहता हूं कि मेरी तार कुछ प्राथमिक जांच के साथ सफल हो जाएगा। ParticularType:एक कस्टम सारप्रोसेसर बनाना और ग्रहण

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CustomAnnotation{ 
} 

अब मैं संकलन समय पर सत्यापन के कुछ प्रकार करना चाहते हैं, जैसे क्षेत्र है कि CustomAnnotation annotates एक विशेष प्रकार का है की जाँच करें:

मान लीजिए मैं एक नया एनोटेशन पैदा करते हैं। मैं जावा 6 में काम कर रहा हूँ, इसलिए मैं एक AbstractProcessor बनाया:

@SupportedAnnotationTypes("com.example.CustomAnnotation") 
public class CompileTimeAnnotationProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, 
          RoundEnvironment roundEnv) { 
     Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CustomAnnotation.class); 
     for(Element e : elements){ 
      if(!e.getClass().equals(ParticularType.class)){ 
       processingEnv.getMessager().printMessage(Kind.ERROR, 
        "@CustomAnnotation annotated fields must be of type ParticularType"); 
      } 
     } 
     return true; 
    } 

} 

फिर कुछ निर्देश मैंने पाया पर आधारित है,, मैं एक फ़ोल्डर META-INF/services बनाया है और सामग्री के साथ एक फ़ाइल javax.annotation.processing.Processor बनाया:

com.example.CompileTimeAnnotationProcessor 

फिर, मैंने परियोजना को एक जार के रूप में निर्यात किया।

एक अन्य परियोजना में, मैं एक साधारण परीक्षण वर्ग बनाया:

public class TestClass { 
    @CustomAnnotation 
    private String bar; // not `ParticularType` 
} 

इस प्रकार मैं ग्रहण परियोजना गुण कॉन्फ़िगर किया गया:

  • सेट जावा संकलक -> एनोटेशन प्रसंस्करण: "एनोटेशन प्रसंस्करण सक्षम करें" और "संपादक में प्रसंस्करण सक्षम करें"
  • जावा कंपाइलर सेट करें -> एनोटेशन प्रोसेसिंग -> फैक्ट्री पथ मेरे निर्यात किए गए जार को शामिल करने के लिए और उन्नत के तहत जांच की गई कि मेरी पूरी तरह से योग्य कक्षा दिखाई देती है।

मैंने प्रोजेक्ट के पुनर्निर्माण के लिए "लागू" और ग्रहण संकेतों पर क्लिक किया, मैं ठीक से मारा - लेकिन एनोटेशन प्रोसेसर होने के बावजूद कोई त्रुटि नहीं फेंक दी गई।

मैं गलत कहां गया?


मैं इस का उपयोग कर के रूप में javac

javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java 
उत्पादन के साथ

@CustomAnnotation एनोटेट क्षेत्रों प्रकार ParticularType का होना चाहिए

+0

सबसे पहले, एनोटिस प्रोसेसर ग्रहण के बाहर जावैक के साथ काम करता है? – antlersoft

+0

@antlersoft: हाँ, यह सीधे javac के साथ ग्रहण के बाहर काम करता है (संपादन इसे प्रतिबिंबित करते हैं)। –

+4

क्या आपने त्रुटि लॉग इन एक्लिप्स (विंडो> शो व्यू> त्रुटि लॉग इन केस को देखा है, जिसे आप इसे नहीं देख सकते हैं) की जांच की है? जब एक एनोटेशन प्रोसेसर विफल हो जाता है तो आपको किसी त्रुटि के साथ पॉपअप संवाद नहीं मिल सकता है लेकिन आपको त्रुटि लॉग में एक त्रुटि दिखाई देगी। आप अपने प्रोसेसर में दयालु = नोट के साथ Messager.printMessage() को छिड़ककर ग्रहण में अपने प्रोसेसर को डीबग करने का भी प्रयास कर सकते हैं, क्योंकि यह त्रुटि लॉग में भी दिखाई देता है। – prunge

उत्तर

17

त्रुटियाँ हैं करने के लिए में दिखाने भाग गया संपादक, Element टी के कारण उसे printMessage फ़ंक्शन में टैग करने की आवश्यकता है। उपर्युक्त उदाहरण के लिए, इसका मतलब है कि संकलन समय जांच का उपयोग करना चाहिए:

processingEnv.getMessager().printMessage(Kind.ERROR, 
    "@CustomAnnotation annotated fields must be of type ParticularType", 
    e); // note we explicitly pass the element "e" as the location of the error 
+1

मुझे पता लगाने के लिए थोड़ी देर लग गई, और भविष्य के दर्शकों के लिए एक नोट के रूप में, लेखक के "processEnv.getMessager()। PrintMessage (" और सही समाधान के रूप में मतदान किया गया है कि एक तीसरा तर्क "ई" पारित किया गया है। – corgrath

+0

समाधान के लिए धन्यवाद। मैं पहले से ही/बिन में अपना एनोटेशन प्रोसेसर टॉस करने वाला था, लेकिन अब यह बहुत अच्छा काम कर रहा है! –

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