2009-04-22 20 views
20

मुझे लगता है कि यह एक ऐसी स्थिति है जहां हर जावा प्रोग्रामर चलता है यदि वे इसे काफी देर तक करते हैं। आप कुछ डिबगिंग कर रहे हैं और कक्षा में बदलाव कर रहे हैं। जब आप प्रोग्राम को फिर से चलाने के लिए जाते हैं, तो इन बदलावों को उठाया नहीं जाता है, बल्कि पुरानी कक्षा अभी भी चल रही है। आप सबकुछ, एक ही मुद्दे को साफ और पुनर्निर्माण करते हैं। कभी-कभी, यह क्लासपाथ पर एक ही कक्षा के क्लासपाथ मुद्दे पर एक बार से अधिक हो सकता है, लेकिन यह पता लगाने का एक आसान तरीका प्रतीत नहीं होता है कि कक्षा कहां से लोड हो रही है ...फाइल सिस्टम पर कहां से मेरा जावा क्लास लोड किया गया था?

क्या लोड किया गया वर्ग के लिए फ़ाइल पथ खोजने का कोई तरीका है? पसंदीदा कुछ ऐसा होगा जो क्लास को .class फ़ाइल या .jar फ़ाइल से लोड किया गया था या तो काम करेगा। कोई विचार?

+0

यह निम्नलिखित प्रश्न के समान ही है, जिसका थोड़ा अलग उत्तर है: http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars –

उत्तर

26

मानक कमांड लाइन स्विच "-verbose:class" का उपयोग करके java चलाएं (the java documentation देखें)। यह प्रत्येक बार कक्षा लोड होने पर प्रिंट करेगा और आपको बताएगा कि यह कहां से लोड किया गया है।

+0

दरअसल, कोई भी JVM, चूंकि -verbose एक आवश्यक ध्वज है, है ना। यह एक्सएक्स झंडे हैं जो विक्रेता निर्भर हैं। –

+0

धन्यवाद, मैंने इसका उल्लेख किया। –

13

आप अनुप्रयोग के भीतर से प्रोग्राम के रूप में यह करना चाहता था, तो कोशिश:

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); 

(ध्यान दें, getCodeSource() अशक्त वापस आ सकते हैं, तो वास्तव में एक पंक्ति :) में ऐसा नहीं करते हैं)

+0

getProtectionDomain भी शून्य (आमतौर पर बूट कक्षाओं के लिए) वापस कर सकता है। मेरा सवाल यह है कि, यदि परिवर्तन नहीं दिख रहे हैं, तो आप इस कोड को कैसे चलाते हैं? :) –

0

चूंकि वर्ग को कक्षा पथ में कहीं से आने की आवश्यकता है, तो मैं बस print the class path को अनुशंसा करता हूं और जांचता हूं कि कहीं आपके वर्ग का पुराना संस्करण है या नहीं।

+3

दरअसल, अब सच नहीं है। सिस्टम कक्षाएं, विस्तार निर्देशिकाएं (हां, बहुवचन), गतिशील रूप से एक्स्टेंसिबल क्लास लोडर (एएलए URLClassLoader) है। इन दिनों, जहां वास्तव में कक्षा से आया था संभवतः काफी जटिल है। –

+0

-1 क्योंकि गलत (सॉफ़्टवेयर बंदर की टिप्पणी देखें) –

+0

कक्षा पथ को प्रिंट करने के बारे में कोई कैसे जाएगा? आपके द्वारा प्रदान किया गया लिंक टूटा हुआ है। – Dezza

5
public static URL getClassURL(Class klass) { 
    String name = klass.getName(); 
    name = "/" + convertClassToPath(name); 
    URL url = klass.getResource(name); 
    return url; 
} 

public static String convertClassToPath(String className) { 
    String path = className.replaceAll("\\.", "/") + ".class"; 
    return path; 
} 

बस इसे कहीं छड़ी करें, और कक्षा के लिए कक्षा वस्तु को पास करें जिसे आप परिभाषा ढूंढना चाहते हैं। इसे इस बात पर ध्यान दिए बिना काम करना चाहिए कि यह कहां से बुलाया जाता है, क्योंकि यह कक्षा के लिए खोजी जा रही है।

public static void main(String[] args) { 
    System.out.println(getClassURL(String.class));  
} 

नमूना उत्पादन: जार: फ़ाइल: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar /java/lang/String.class

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