2010-09-09 17 views
9

आप शायद पूछेंगे, मैं ऐसा क्यों करना चाहूंगा - ऐसा इसलिए है क्योंकि मैं कक्षा (बाहरी पुस्तकालय से) का उपयोग कर रहा हूं जो इसके स्थिर प्रारंभकर्ता में सामान करता है और मुझे यह जानने की ज़रूरत है कि यह किया गया है या नहीं।कैसे जांचें कि कक्षा शुरू हुई है या नहीं?

मैंने ClassLoader पर देखा, लेकिन उपयोगी कुछ भी नहीं मिला। कोई विचार?

+1

आपका मतलब है "क्या कक्षा शुरू हुई है"। एक बड़ा अंतर है। – irreputable

+0

इसे इंगित करने के लिए धन्यवाद। मैंने शीर्षक बदल दिया। – mik01aj

+1

कौन सी लाइब्रेरी? शायद एक साइड इफेक्ट है जिसके लिए आप जांच सकते हैं (उदाहरण के लिए, जेडीबीसी ड्राइवर खुद को ड्राइवर प्रबंधक में पंजीकृत करते हैं)। –

उत्तर

13

आप ClassLoader.findLoadedClass() विधि का उपयोग कर सकते हैं। अगर यह शून्य हो जाता है, तो कक्षा लोड नहीं होती है। इस तरह आप वर्ग को लोड नहीं करते हैं अगर यह पहले से लोड नहीं हुआ था।


चेतावनी: इस कोड वास्तव में यहाँ काम नहीं करता है, सिस्टम classloader में, findLoadedClass() सुरक्षित है, आप अपने खुद के classloader से ओवरराइड कर की जरूरत है।

चेक एक ही विषय पर नीचे दिए गए लिंक करता है, तो एक वर्ग @irreputable से प्रणाली classloader साथ

if(ClassLoader.getSystemClassLoader().findLoadedClass("java.lang.String") != null){ 
    System.out.println("Yepee, String is loaded !"); 
} 

बहुत अच्छा बिंदु भरी हुई है की जाँच करने के:

"लोड" का मतलब "प्रारंभिक" नहीं है। प्रारंभ केवल JLS3 $ 12.4.1

द्वारा परिभाषित सटीक क्षणों में क्या होता है और मैं बोली:

एक वर्ग या इंटरफ़ेस प्रकार टी निम्नलिखित में से किसी एक की पहली आवृत्ति से ठीक पहले प्रारंभ हो जाएगा :

  • टी एक वर्ग और की टी बनाई गई है एक उदाहरण है।
  • टी एक वर्ग है और टी द्वारा घोषित एक स्थैतिक विधि है।
  • टी द्वारा घोषित एक स्थिर क्षेत्र असाइन किया गया है।
  • टी द्वारा घोषित एक स्थिर क्षेत्र का उपयोग किया जाता है और फ़ील्ड स्थिर चर (§4.12.4) नहीं है।
  • टी एक शीर्ष स्तर वर्ग है, और एक assert बयान (§14.10) lexically टी निष्पादित किया जाता है के भीतर नेस्ट। वर्ग Class में और पैकेज java.lang.reflect में कुछ चिंतनशील तरीकों में से

प्रार्थना भी वर्ग या इंटरफ़ेस प्रारंभ कारण बनता है। किसी भी अन्य परिस्थिति में कक्षा या इंटरफेस शुरू नहीं किया जाएगा।


संसाधन:

सा पर मुझे विषय:

+0

जब आप विधि कॉल करते हैं तो 'स्ट्रिंग' लोड होने का कारण यह नहीं होगा क्योंकि इसे' स्ट्रिंग 'शाब्दिक 'java.lang.String" का मूल्यांकन करना है? –

+0

ठीक है, कोड वास्तव में बिल्कुल काम नहीं करता है, हम डिफ़ॉल्ट श्रेणी लोडर पर findLoadedClass() को कॉल नहीं कर सकते हैं। तो इसे एक साधारण उदाहरण के रूप में मानें। –

+0

निश्चित रूप से, एक सरल सरल उदाहरण है, लेकिन फिर भी, क्या आपका 'if' कथन हमेशा' सत्य 'का मूल्यांकन नहीं करेगा? –

4

आप कक्षा का संदर्भ क्यों नहीं देते (संदर्भ बनाकर, एक उदाहरण बनाकर, या एक स्थिर सदस्य तक पहुंच)? अगर टाइप पहले से नहीं निकाल दिया गया है और यदि यह है तो आप अभी भी जाने के लिए अच्छे हैं।

+0

क्योंकि यह लाइब्रेरी 'System.getProperty' के साथ पैरामीटर पढ़ती है और मुझे यह जानने की ज़रूरत है कि मैं अभी भी उन्हें बदल सकता हूं या नहीं। – mik01aj

2

आप JVM कक्षाएं बाहर मुद्रित करने के लिए के रूप में यह उन्हें लोड करता है, -verbose ध्वज का उपयोग कर प्राप्त कर सकते हैं। यह आपकी मदद की हो सकती है।

java -verbose Dummy|head 
[Opened C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar] 

(Btw, सिर्फ इस एक नमस्ते विश्व कार्यक्रम पर की कोशिश की और यह 309 कक्षाओं लोड वाह!)

1

आप कुछ इस तरह की कोशिश कर सकते हैं:

क्लास c = नए classloader() { कक्षा सी = findLoadedClass (कक्षा नाम); }।सी;

+0

में काम नहीं करती है, यह काम नहीं करती है, यह निश्चित रूप से शून्य हो जाएगी। – irreputable

0
Class.forName("com.abc.Xyz", true, this.getClass().getClassLoader()) 

यह जब तक वर्ग

0

(स्वयं या किसी अन्य धागे से) प्रारंभ कर दिया गया है इसकी नहीं बहुत देर हो चुकी .. यह ठीक रूप में अच्छी तरह से काम करना चाहिए

Class.forName().newInstance(); 

newInstance() को अवरुद्ध कर देगा इस कक्षा वस्तु द्वारा प्रतिनिधित्व वर्ग का एक नया उदाहरण बनाता है। कक्षा को तत्काल तर्क सूची के साथ एक नई अभिव्यक्ति के रूप में तत्काल किया जाता है। कक्षा शुरू की गई है अगर इसे पहले ही शुरू नहीं किया गया है।

1

मुझे पता है कि यह बहुत देर हो चुकी है, लेकिन मुझे लगता है कि यह उत्तर उपयोगी हो सकता है। तुम भी डर नहीं कर रहे हैं (और आप अनुमति दी जाती है) sun.misc.Unsafe वर्ग का उपयोग करने के लिए एक विधि है ठीक करता है कि: विधि

sun.misc.Unsafe.shouldBeInitialized(Class) 

रिटर्न true अगर और Class पैरामीटर के रूप में प्रदान की जाती है केवल अगर (लोड किया गया लेकिन) शुरू नहीं हुआ।

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