2015-08-25 7 views
5

वर्ग लोड हो रहा है विधियों के बीच अंतर के बारे में एक लोकप्रिय answer में, जॉन स्कीट ने कहा है,क्लासलोडर संसाधन पथ हमेशा पूर्ण होते हैं?

classloader संसाधन पथ हमेशा पूर्ण माना जाता है।

एक और भी लोकप्रिय answer इस कथन को एक उदाहरण के साथ पुष्टि करता है।

ClassLoader.getResourceAsStream(path) सभी रास्तों पर विचार पूर्ण पथ होना करने के लिए होगा। तो String.getClassLoader().getResourceAsString("myfile.txt") और String.getClassLoader().getResourceAsString("/myfile.txt") दोनों दोनों अपने क्लासपाथ में निम्न स्थान पर एक फ़ाइल की तलाश करेंगे: ./myfile.txt

इस तथ्य को खारिज करते हुए कि उदाहरण संकलित नहीं होगा, सर्वसम्मति से संकेत मिलता है कि एक अग्रणी फॉरवर्ड स्लैश क्लासलोडर के लिए अप्रासंगिक है।

एक साधारण परीक्षण अन्यथा दिखाता है।

Foo.class.getClassLoader().getResource("test.xml") // file
Foo.class.getClassLoader().getResource("/test.xml") // null

मैं बस पथ files/test.xml एक परीक्षण परियोजना के classpath के लिए, एक वर्ग के साथ नामित किया गया Foo एक main() विधि उन दो कॉल के परिणामों को प्रिंट युक्त जोड़ लिया है। मुझे क्या याद आ रहा है, क्योंकि सैकड़ों लोगों ने उपर्युक्त उत्तरों को वोट दिया है? क्या क्लासलोडर्स पूर्ण हैं, या वे इनपुट नाम की संरचना पर निर्भर करते हैं?


यह Oracle blog post मेरी समझ के लिए उपयोगी था।

विधि जो संसाधन नाम से यूआरएल बनाती है वह URLClassPath.JarLoader.checkResource() है।

+0

मेरे अनुभव से, संसाधन की राह क्या आप इसे देने पर निर्भर है "jar file URL" के लिए मामला है। उदाहरण के लिए '/ myfile.txt'' {classpath}/myfile.txt' की तलाश करेगा, लेकिन 'myfile.txt'' {classpath}/{class package path}/myfile.txt' की तलाश करेगा, जहां '{class पैकेज पथ} 'यह अनुरोध करने के लिए उपयोग किए जाने वाले वर्ग का पैकेज पथ है, यह कहकर कि यह 'GetResource' का उपयोग करने के तरीके के आधार पर बदल जाएगा, उदाहरण के लिए,' this.getResource (...) 'वर्णित के रूप में काम करेगा, लेकिन' SomeClass.class.getResource (...) 'जैसी कुछ नहीं करेगा (यदि मैं सही हूं, तो यह आपके द्वारा वर्णित कार्य करेगा)। – MadProgrammer

+0

'क्लासलोडर' संसाधन पथ हमेशा पूर्ण होते हैं, लेकिन एक अग्रणी '/' ** अमान्य ** है, न केवल ** अनावश्यक **। –

+1

@MadProgrammer आप 'ClassLoader.getResource()' के साथ 'class.getResource()' को भ्रमित कर रहे हैं। उत्तरार्द्ध के पास पैकेज नाम के बारे में जानने का कोई तरीका नहीं है। – EJP

उत्तर

1

स्पष्ट रूप से नहीं।

getResource(name) में name की व्याख्या करने के लिए यह कक्षा लोडर पर निर्भर है।

URLClassLoader के स्रोत कोड की जांच करना, अंत में यह कहता है

new URL(baseURL, name)

यह यहाँ महत्वपूर्ण है कि क्या name पूर्ण या संबंधित है

यह संभव है कि, कुछ baseURL, पूर्ण /foo/bar और रिश्तेदार के लिए foo/bar का एक ही प्रभाव है। विशेष रूप से, यह हमेशा classpaths

baseURL:  jar:file:/home/duke/duke.jar!/ 

foo/bar -> jar:file:/home/duke/duke.jar!/foo/bar 
/foo/bar -> jar:file:/home/duke/duke.jar!/foo/bar 
संबंधित मुद्दे