के साथ कोड प्रतिस्थापन मैं कक्षा पर विधियों और फ़ील्ड डालने के लिए annotation processor लिखने की कोशिश कर रहा हूं ... और दस्तावेज़ीकरण इतना अस्पष्ट है। मैं दूर नहीं जा रहा हूं और मुझे नहीं पता कि मैं इसे सही तरीके से देख रहा हूं या नहीं।एक एनोटेशन प्रोसेसर
प्रसंस्करण वातावरण Filer
ऑब्जेक्ट प्रदान करता है जिसमें नए स्रोत और कक्षा फ़ाइलों को बनाने के लिए आसान तरीके हैं। वे ठीक काम करते हैं लेकिन फिर मैंने यह पता लगाने की कोशिश की कि मौजूदा स्रोत फ़ाइलों को कैसे पढ़ा जाए, और यह सब कुछ "getResource" प्रदान करता है। तो मेरी प्रोसेसर कार्यान्वयन में मैं इस किया है:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
}
}
} catch (Exception e) {
e.printStackTrace();
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
}
return true;
}
मेरी पहली उलझन मुझे लगता है कि element.asType().toString().replace(".", "/") + ".java"
(योग्य प्रकार का नाम मिलता है और यह एक पैकेज और स्रोत फ़ाइल पथ में कन्वर्ट करने के लिए) नहीं लग रहा है मदद नहीं कर सकता है समस्या से संपर्क करने का एक अच्छा तरीका है। बाकी एपीआई इतनी अधिक इंजीनियर है लेकिन मूल स्रोत कोड को पुनर्प्राप्त करने के लिए एक आसान तरीका प्रतीत नहीं होता है।
असली समस्या यह है कि तब संकलक आउटपुट निर्देशिका ("त्रुटि: डुप्लिकेट क्लास") में दूसरी स्रोत फ़ाइल द्वारा स्वचालित रूप से परेशान हो जाता है और अब मैं अटक गया हूं।
मैंने पहले से ही यह बाकी लिखा है - कुछ डेटा की गणना करने और फ़ील्ड मानों और विधियों को सम्मिलित करने के लिए मैक्रो लेक्सर और पार्सर और व्हाट्नॉट - लेकिन यह कंपाइलर के बाहर प्रारंभिक चरण के रूप में कार्य करता है। इस तथ्य को छोड़कर कि मूल फ़ाइलों में .java एक्सटेंशन नहीं हो सकता है (उन्हें देखकर संकलक को रोकने के लिए), यह अच्छी तरह से काम करता है। तब मैंने सुना कि एनोटेशन कोड पीढ़ी कर सकते हैं, जो मुझे लगता है कि यह अधिक उचित और सुविधाजनक होगा, लेकिन मुझे इसके बारे में ज्यादा मार्गदर्शन नहीं मिल रहा है।
देखें: http://techbitsfromsridhar.blogspot.ca/2013/02/java-compiler-plug-ins-in-java-8-use.html –