के साथ एकीकृत करना मैं एक नई एनोटेशन बनाने की कोशिश कर रहा हूं जिसके साथ मैं कुछ रनटाइम तारों को करूँगा, लेकिन, कई कारणों से, मैं संकलन समय पर सत्यापित करना चाहता हूं कि मेरी तार कुछ प्राथमिक जांच के साथ सफल हो जाएगा। 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 का होना चाहिए
सबसे पहले, एनोटिस प्रोसेसर ग्रहण के बाहर जावैक के साथ काम करता है? – antlersoft
@antlersoft: हाँ, यह सीधे javac के साथ ग्रहण के बाहर काम करता है (संपादन इसे प्रतिबिंबित करते हैं)। –
क्या आपने त्रुटि लॉग इन एक्लिप्स (विंडो> शो व्यू> त्रुटि लॉग इन केस को देखा है, जिसे आप इसे नहीं देख सकते हैं) की जांच की है? जब एक एनोटेशन प्रोसेसर विफल हो जाता है तो आपको किसी त्रुटि के साथ पॉपअप संवाद नहीं मिल सकता है लेकिन आपको त्रुटि लॉग में एक त्रुटि दिखाई देगी। आप अपने प्रोसेसर में दयालु = नोट के साथ Messager.printMessage() को छिड़ककर ग्रहण में अपने प्रोसेसर को डीबग करने का भी प्रयास कर सकते हैं, क्योंकि यह त्रुटि लॉग में भी दिखाई देता है। – prunge