2012-05-09 8 views
6

Generators का उपयोग कर कक्षाएं बनाते समय, एक प्रकार के सभी उप-वर्गों को खोजना संभव है। आप GWT शोकेस स्रोत में उदाहरण के लिए इस तकनीक प्राप्त कर सकते हैं (full code देखें):क्या GWT जेनरेटर कॉन्टेक्स्ट का उपयोग करके @MyAnnotation के साथ एनोटेटेड सभी कक्षाएं खोजना संभव है?

JClassType cwType = null; 
try { 
    cwType = context.getTypeOracle().getType(ContentWidget.class.getName()); 
} catch (NotFoundException e) { 
    logger.log(TreeLogger.ERROR, "Cannot find ContentWidget class", e); 
    throw new UnableToCompleteException(); 
} 
JClassType[] types = cwType.getSubtypes(); 

मैं ऐसी ही कुछ करना चाहते हैं, लेकिन इसके बजाय का एक वर्ग का विस्तार (या लागू करने एक अंतरफलक)

public class SomeWidget extends ContentWidget { ... } 

, क्या मैं इसे द्वारा टिप्पणियों को एनोटेट कर सकता हूं?

@MyAnnotation(...) 
public class SomeWidget extends Widget { ... } 

और फिर सब विजेट कि @MyAnnotation से एनोटेट खोजने? मुझे JAnnotationType.getAnnotatedTypes() जैसी कोई विधि नहीं मिली, लेकिन शायद मैं सिर्फ अंधा हूं?

नोट: मैं इसे Google Reflections पुस्तकालय के साथ काम करते हैं, reflections.getTypesAnnotatedWith(SomeAnnotation.class) का उपयोग कर बनाने के लिए सक्षम था, लेकिन मैं बजाय GeneratorContext का उपयोग कर, विशेष रूप से, क्योंकि यह एक बहुत बेहतर काम करता है जब DevMode में एप्लिकेशन को फिर से लोड करना चाहते।

उत्तर

8

हां - सभी प्रकारों के माध्यम से पुन: प्रयास करना सबसे आसान तरीका है, और उन्हें एनोटेशन के लिए जांचें। आपके पास अन्य नियम भी हो सकते हैं (सार्वजनिक है, गैर-सार है) जो उस समय भी किया जाना चाहिए।

for (JClassType type : oracle.getTypes()) { 
    MyAnnotation annotation = type.getAnnotation(MyAnnotation.class); 
    if (annotation != null && ...) { 
    // handle this type 
    } 
} 

TypeOracle उदाहरण context.getTypeOracle() का उपयोग कर GeneratorContext से प्राप्त किया जा सकता है।

ध्यान दें कि यह आपको केवल स्रोत पथ पर प्रकारों तक पहुंच प्रदान करेगा। यही है, वर्तमान में केवल माइक्रोसॉफ्ट के मॉड्यूल के आधार पर उपलब्ध हैं और <source> टैग उपयोग में हैं।

+0

+1, जो निश्चित रूप से काम करता है, और मैंने इस दृष्टिकोण पर विचार नहीं किया। यह एक तरह का क्रूर बल है (जो बहुत अधिक मायने रखता नहीं है क्योंकि किसी के पास लाखों प्रकार नहीं होंगे)। यदि आपके लिए कोई पूर्व परिभाषित समाधान नहीं है, तो मैं खुशी से आपका जवाब स्वीकार करूंगा। –

+0

यह अधिकांश जावा के परिप्रेक्ष्य से क्रूर बल महसूस करता है, लेकिन केवल स्रोत पथ के भीतर यह इतना बुरा नहीं होगा। इसके अलावा, Google Reflections लाइब्रेरी में फ़ंक्शन को भी करना होगा - वर्तमान में क्लासपाथ पर सभी कक्षाओं को ढूंढें और देखें। –

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

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