जावा 8 में कस्टम टाइप एनोटेशन का उपयोग कैसे करें जावा 8 में टाइप एनोटेशन (JSR 308) नामक सुविधा है। मैं ऑब्जेक्ट मैपर फ्रेमवर्क के लिए सरल ऑब्जेक्ट के लिए इसका उपयोग करना चाहता हूं। मैं इसजावा
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
तरह एनोटेशन @ExpectedType को परिभाषित और फिर इस तरह मेरी कोड में उपयोग करना चाहते हैं:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
कक्षाएं ObjectA_DTO
और ObjectA_Entity
द्वारा कार्यान्वित एक अंतरफलक है।
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
मैं वस्तु नक्शाकार उपयोग करने के लिए SomeServiceImpl तरीकों में से परिवर्तन कॉल करना चाहते हैं: सेवा मैं चाहते हैं इस तरह से उपयोग करने के लिए। यह JSR 269 या एओपी द्वारा जेनरेट कोड द्वारा हासिल किया जा सकता है।
समस्या यह है कि मैंने सरल एनोटेशन प्रोसेसर लिखा है और यह टाइप एनोटेशन को संभाल नहीं करता है। सरल एनोटेशन प्रोसेसर के स्रोत इस तरह दिखता है:
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class SimpleAnnotationsProcessor extends AbstractProcessor {
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Messager messager = processingEnv.getMessager();
try {
for (TypeElement e : annotations) {
messager.printMessage(Diagnostic.Kind.NOTE, e.toString());
for (Element elem : roundEnv.getElementsAnnotatedWith(e)) {
messager.printMessage(Diagnostic.Kind.NOTE, elem.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
कोई भी विचार कैसे उपयोग करने के लिए या कैसे SimpleAnnotationsProcessor द्वारा प्रकार एनोटेशन का उपयोग करने की? प्लग करने योग्य एनोटेशन प्रोसेसिंग एपीआई का उपयोग मेरे लिए जरूरी नहीं है, मुझे लगता है कि जावा प्रतिबिंब से बेहतर प्रदर्शन होगा। वैसे भी मुझे नहीं पता कि जावा प्रतिबिंब के माध्यम से टाइप एनोटेशन तक कैसे पहुंचे।
इस्तेमाल किया जा सकता मुझे लगता है मैं स्पष्ट नहीं क्या लक्ष्य आप प्राप्त करना चाहते हैं हूँ। क्यों न केवल विधि हस्ताक्षर 'ऑब्जेक्टए_DTO doSomething (ObjectA_Entity)' बनाओ, अगर आप ऐसा करने की अपेक्षा कर रहे हैं? –
विधि हस्ताक्षर इस तरह से नहीं हो सकता है, क्योंकि मैं इस 'someService.doSomething (new ObjectA_DTO()) जैसे सेवा उदाहरण का उपयोग करना चाहता हूं। मैं ऑब्जेक्ट मैपर को 'ObjectA_DEO' को 'ऑब्जेक्टए_एन्टीटी' पर मैप करने के लिए कार्यान्वित करना चाहता हूं और एनोटेशन टाइप करें @ एक्सपेक्टेड टाइप टाइप प्रकार को परिभाषित करता है। यही कारण है कि हस्ताक्षर को 'IObjectA do कुछ (IObjectA)' होना चाहिए। –
मैंने अभी आपके प्रश्न को पास करने में पकड़ा ... मैंने उत्पाद लाइन विकास पर एक सेमेस्टर प्रोजेक्ट किया जहां हमने एनोटेशन को संसाधित किया। अभी के लिए, मैं आपको इस महत्वपूर्ण ट्यूटोरियल के साथ छोड़ दूंगा जो वास्तव में मुझे विषय पर जा रहा है (आप कोड पीढ़ी के बारे में भाग 3 छोड़ सकते हैं) - https://deors.wordpress.com/2011/09/26/annotation-types/ बाद में, मैं प्रगति के लिए इस पोस्ट को दोबारा जांचूंगा। – ThisClark