2015-01-12 10 views
5

का काम क्या है मैंने छोटे जावा क्लास को लिखा है जिसे मैं क्लासलोडर का उपयोग करके लोड करना चाहता हूं।क्लासलोडर लोड क्लास()

public class ClassLoadingObj { 

    public ClassLoadingObj(){ 
     System.out.println("---instantiating ClassLoadingObj "); 
    } 

    static{ 
     System.out.println("---Loading ClassLoadingObj"); 
    } 
} 

लेकिन जब मैं निम्न कोड निष्पादित:

ClassLoader.getSystemClassLoader().loadClass("com.st.classLoader.ClassLoadingObj"); 

मुझे लगता है कि स्थिर ब्लॉक निष्पादित नहीं होती है। मेरा सवाल यह है कि यदि loadClass() विधि का उपयोग करके कक्षा को लोड किया जाता है, तो स्थिर ब्लॉक को हमेशा उस वर्ग को तुरंत चालू करने की तुलना में क्यों निष्पादित किया जाता है जहां स्थिर ब्लॉक हमेशा निष्पादित होते हैं।

उत्तर

0

जावा में दो प्रकार के क्लास लोडर हैं। हो सकता है कि आप जिस क्लासलोडर का उपयोग करते हैं वह java.lang.ClassLoader है, लेकिन सिस्टम इस क्लासलोडर का उपयोग नहीं करेगा। आप com.sun.org.apache.bcel.internal.util.ClassLoader.getSystemClassLoader() का प्रयास कर सकते हैं, यह स्थिर ब्लॉक निष्पादित करेगा। अधिक जानकारी आप इस पेज (http://en.wikipedia.org/wiki/Java_Classloader#Class_Loaders_in_JEE)

3

वास्तव में स्थिर ब्लॉक निष्पादित हो जाता है जब वर्ग है संदर्भित कर सकते हैं प्रारंभ और यह एक छोटा सा से अलग लोड है।

से पहले प्रारंभ वर्ग जुड़ा हुआ है और इससे पहले कि यह है कि लोड, इसलिए वहाँ 3 (या 4, नहीं-लोडेड सहित) वर्ग की राज्य हैं।

Here अच्छी तरह से वर्णन किया गया है कि यह कैसे काम करता है और कक्षा को आरंभ करने के लिए क्या आवश्यकताएं हैं।

एक अंश:

जावा आभासी मशीन विनिर्देश कार्यान्वयन वर्ग और इंटरफ़ेस लोड हो रहा है और जोड़ने, के समय में लचीलापन देता है, लेकिन सख्ती से प्रारंभ के समय को परिभाषित करता है। सभी कार्यान्वयन को अपने पहले सक्रिय उपयोग पर प्रत्येक कक्षा या इंटरफ़ेस को प्रारंभ करना होगा।

  • एक वर्ग का एक नया उदाहरण बन जाता है (एक नई शिक्षा का निष्पादन bytecodes में, वैकल्पिक रूप से, निहित निर्माण, प्रतिबिंब, क्लोनिंग, या अक्रमांकन के माध्यम से।।): निम्नलिखित छह स्थितियों के रूप में सक्रिय उपयोग करता है अर्हता
  • एक स्थिर विधि एक वर्ग द्वारा घोषित के आह्वान (bytecodes में, एक invokestatic शिक्षा का निष्पादन)
  • उपयोग या एक स्थिर क्षेत्र क्लास अथवा अंतरफलक द्वारा घोषित का काम, स्थिर क्षेत्रों है कि अंतिम कर रहे हैं के अलावा और एक संकलन-समय निरंतर अभिव्यक्ति (बाइटकोड में, निष्पादनमें प्रारंभ किया गया एक getstatic या putstatic अनुदेश) की
  • ऐसे वर्ग कक्षा में तरीकों के रूप में या java.lang.reflect पैकेज
  • एक का एक उपवर्ग के प्रारंभ में कक्षाओं में जावा एपीआई में कुछ चिंतनशील तरीकों, के आह्वान कक्षा (कक्षा के आरंभ में इसके सुपरक्लास के पूर्व आरंभिकरण की आवश्यकता होती है।)
  • प्रारंभिक वर्ग के रूप में एक वर्ग के पद पर नियुक्ति < विधि (मुख्य (साथ)) जब एक जावा आभासी मशीन अप
शुरू होता है
संबंधित मुद्दे