2012-04-24 9 views
20

मैं सभी वर्गों कि इतने की तरह एक विशिष्ट इंटरफ़ेस को लागू लगाने के लिए जावा ServiceLoader का उपयोग करने की कोशिश की:ServiceLoader

loader = ServiceLoader.load(Operation.class); 
try { 
    for (Operation o : loader) { 
     operations.add(o); 
    } 
} catch (ServiceConfigurationError e) { 
    LOGGER.log(Level.SEVERE, "Uncaught exception", e); 
} 

दुर्भाग्य से, जब मैं डिबग मोड में ग्रहण चलाने ServiceLoader नहीं है किसी भी कक्षा को खोजें। मुझे लगता है कि मुझे एक मामूली बिंदु याद आ रहा है ...

+6

क्या आपके पास 'मेटा-आईएनएफ/सेवाएं/fqcn.Operation' कॉन्फ़िगर किया गया है? – nobeh

उत्तर

25

ServiceLoader ऐसा नहीं कर सकता।

ServiceLoader द्वारा खोज की जा सकने वाली सेवा के रूप में कक्षा को बेनकाब करने के लिए आपको Creating Extensible Applications With the Java Platform में वर्णित अनुसार प्रदाता कॉन्फ़िगरेशन फ़ाइल में अपना नाम डालना होगा।

कोई विशेष इंटरफ़ेस लागू करने वाले सभी वर्गों को खोजने के लिए कोई अंतर्निहित तरीके नहीं हैं। फ्रेमवर्क जो कुछ भी कर सकते हैं, अपने स्वयं के क्लासपाथ स्कैनिंग समाधान का उपयोग करते हैं (और यहां तक ​​कि कस्टम क्लासपाथ स्कैनिंग के साथ भी यह आसान नहीं है क्योंकि .class फ़ाइलें केवल इंटरफेस के बारे में जानकारी को सीधे लागू नहीं करती हैं, पारगमन से नहीं)।

18

कार्यान्वयन जो कि आप अपने आप को लिखा हैं, तो आप AutoService इस्तेमाल कर सकते हैं ServiceLoader इंटरफेस के माध्यम से उन्हें उपलब्ध बनाने के लिए, जैसे

@AutoService(Operation.class) 
class Foo implements FooInterface { 

} 

@AutoService(Operation.class) 
class Bar extends Foo { 

} 
+2

इस सुझाव के लिए बहुत बहुत धन्यवाद! मैं प्रदाता फ़ाइल को काम करने के लिए नहीं मिला। इसे गलत जगह पर या टाइपो या कुछ के साथ रखना होगा, लेकिन यह मेवेन के साथ बॉक्स के ठीक बाहर काम करता था। आप http://mvnrepository.com/artifact/com.google.auto.service/auto-service –

+0

पर मेवेन रिपोजिटरी में नवीनतम संस्करण पा सकते हैं मेरी खुशी! यदि आपके पास सुधार हैं, तो भविष्य के लिए भविष्य में (भविष्य में) – Xiao

+0

दर्शकों के लिए उत्तर संपादित करें यह ऑटो सेवा शानदार है! – Frankie

0

आदेश में विशिष्ट इंटरफ़ेस तुम करोगी के कार्यान्वयन के लिए कार्यावधि में अपने classpath स्कैन करने के लिए विभिन्न समाधान उदाहरण का उपयोग करने की आवश्यकता है। Reflections (नोट एस अंत में, यह जावा की प्रतिबिंब API नहीं है)