2009-03-18 9 views
10

मैं एक intialization तंत्र कि एनोटेशन आधारित जावा में है लागू करना चाहते हैं। विशेष रूप से, मैं है एक एनोटेशन मैं परिभाषित किया है:मैं क्लासपाथ पर सभी कक्षाओं को कैसे ढूंढ सकता हूं जिनके पास एक विशिष्ट विधि एनोटेशन है?

public interface SomeKindOfBasicInterface {} 

मैं @Initialization एनोटेशन है कि मेरी classpath पर SomeKindOfBasicInterface वर्ग के हर कार्यान्वयन लगाना चाहते हैं:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Initialization { 

/** 
* If the eager initialization flag is set to <code>true</code> then the 
* initialized class will be initialized the first time it is created. 
* Otherwise, it will be initialized the first time it is used. 
* 
* @return <code>true</code> if the initialization method should be called 
*   eagerly 
*/ 
boolean eager() default false; 

} 

साथ ही, मैं एक अंतरफलक है एक विधि पर मैं वसंत के MetaDataReader उपकरण है, जो सबसे अच्छा तरीका अन्य SomeKindOfBasicInterface कार्यान्वयन को लोड करते हुए मैं यह कर रहा हूँ स्थगित करने की तरह लग रही पर देख रहा हूँ ... लेकिन मैं जैसे मैं वर्णन कर रहा हूँ खोज करने के लिए कैसे यकीन नहीं है। कोई सुझाव?

+0

[रनटाइम पर जावा एनोटेशन स्कैनिंग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/259140/scanning-java-annotations-at-runtime) –

उत्तर

10

आप Reflections है, जो एक जावा रनटाइम मेटाडाटा विश्लेषण उपकरण है इस्तेमाल कर सकते हैं। मैंने इसे किसी दिए गए प्रकार के सभी उपप्रकार प्राप्त करने के लिए उपयोग किया है, लेकिन यह आपके मामले को भी संभाल सकता है।

+6

मैं दृढ़ता से या प्रतिबिंबित रूप से क्लासलोडर का उपयोग न करने का सुझाव दूंगा, यदि समय/स्थान क्षमताएं चिंता से दूर हैं। आपके क्लासपाथ में कक्षाओं का एक टन हो सकता है और वे सभी लोड कक्षाएं अब परमजन में हैं। एएसएम (या बाइटकोड लाइब्रेरी) जैसे कुछ का उपयोग करें और बस बाइट [] एस पढ़ें, कक्षा के बारे में जानकारी प्राप्त करने के लिए एएसएम लाइब्रेरी का उपयोग करें। 'क्या यह एक्स के साथ एनोटेटेड है?' और फिर और केवल तब ही उस वर्ग को लोड करें (यदि आपको उस वर्ग की आवश्यकता होती है)। – alphazero

+0

@alphazero: प्रतिबिंब ** एस ** वास्तव में java.lang.reflect का उपयोग नहीं करता है। यह आपके द्वारा वर्णित विधि के समान ही उपयोग करता है, जैवसिस्ट वर्ग मेटाडेटा को पढ़ने के लिए ताकि वास्तव में कक्षाएं लोड करने से बचें। – Nicholas

+0

@ निकोलस मुझे लगता है कि जेवीएम कार्यान्वयन विशिष्ट है। Spec पर एक gander नहीं था। (हाल ही में) तो अगर यह वास्तव में spec'd ("जावास्वाद का उपयोग करें") लिंक की सराहना करेंगे! – alphazero

1

मैं मूल रूप से एक BeanPostProcessor कार्यान्वयन, हो सकता है CommonAnnotationBeanPostProcessor के आधार पर बना सकेगी। तब मैं component-scan कि classpath को स्कैन करता है और सभी अपने विनिर्देश मिलान सेम ऊपर उठाता है के लिए स्थापित होगा। जब बीन शुरू किया जाता है, तो आपका पोस्टप्रोसेसर चलाया जाएगा।

मुझे लगता है मैं यह सोचते हैं कि आप सेम के लिए देख रहे देखते हैं। यदि ऐसा नहीं है तो आपको कक्षा को स्वयं स्कैन करना पड़ सकता है।

1

आप अपने वर्गों में एनोटेशन खोजने के लिए javassist का उपयोग कर सकते हैं, इससे पहले कि आप उन्हें लोड कर सकें, लेकिन आपको सीधे .class फ़ाइलों को पढ़ने की आवश्यकता है, जिसका अर्थ है कि आप स्वयं द्वारा एक जार खोलना आदि। कक्षाओं को देखने के लिए। आप अपने BasicInterface के सभी उप-वर्गों के लिए केवल रनटाइम से नहीं पूछ सकते हैं।

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

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