2009-06-02 22 views
10

कहें, मेरे पास क्लास ऑब्जेक्ट का संदर्भ है जिसमें कुछ टाइप टाइप एक स्थिर विधि है। क्या उस विधि को कॉल करने का कोई तरीका है w/o कुछ टाइप टाइप को पहले? अधिमानतः मजबूत टाइपिंग से बच नहीं है।कक्षा पर स्थिर विधि कॉलिंग?

संपादित करें: ठीक है, मैं खराब हो गया हूं।

interface Int{ 
    void someMethod(); 
} 

class ImplOne implements Int{ 
    public void someMethod() { 
     // do something 
    } 
} 

Class<? extends Int> getInt(){ 
    return ImplOne.class; 
} 

इस मामले में someMethod() किसी भी तरह स्थिर नहीं हो सकता है।

+0

मुझे लगता है कि यह प्रश्न वास्तव में जावा प्रतिबिंब के बारे में है, लेकिन यह वास्तव में स्पष्ट नहीं है। –

+0

हम्म, मुझे नहीं लगता। –

उत्तर

24

एक स्थिर विधि परिभाषा के अनुसार एक वर्ग पर और उस वर्ग का एक उदाहरण पर नहीं कहा जाता है।

तो अगर आप का उपयोग करें:

SomeClass.someStaticMethod() 

आप कुछ भी नहीं कर रहे हैं instantiating (अलग वर्ग लदान और SomeClass वर्ग ही है, जो JVM संभालती है और जिस तरह से बाहर अपने दायरे की है की इन्स्टेन्शियशन छोड़ दें)।

यह एक नियमित रूप से विधि एक वस्तु पर कहा जाता है, जो पहले से ही instantiated कर दिया गया है करने का विरोध किया जाता है:

SomeObject o = someObject; // had to be instantiated *somewhere* 
o.someMethod(); 
+2

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

+1

मुझे लगता है कि सूर्य का संकलक स्वयं भी उस चेतावनी को जारी करता है, अब भी। मेरा मानना ​​है कि यह काफी भ्रमित है कि इसे एक त्रुटि दी जानी चाहिए: http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- त्रुटि के लिए-जावा कॉम – Thilo

24

मुझे यकीन नहीं है कि स्थिति क्या है, लेकिन यदि आप कक्षा के प्रकार को जानने के बिना कक्षा पर स्थैतिक विधि निष्पादित करना चाहते हैं (यानी आप इसे कुछ टाइप नहीं जानते हैं, तो आपके पास क्लास ऑब्जेक्ट है), तो आपको नाम और विधि आप प्रतिबिंब इस्तेमाल कर सकते हैं के मापदंडों को जानते हैं और ऐसा करते हैं:

Class c = getThisClassObjectFromSomewhere(); 

//myStaticMethod takes a Double and String as an argument 
Method m = c.getMethod("myStaticMethod", Double.class, String.class); 
Object result = m.invoke(null, 1.5, "foo"); 
-1

हां। यही वैचारिक तरीकों के बारे में है। बस इसे बुलाओ। SomeType.yourStaticMethodHere()।

10

चूंकि आप क्लास ऑब्जेक्ट के बारे में बात करते हैं, मुझे लगता है कि आप जावा प्रतिबिंब में रूचि रखते हैं। यहां एक संक्षिप्त स्निपेट है जो आप करने की कोशिश कर रहे हैं:

Class someClass = SomeType.class; 
Method staticMethod = someClass.getMethod("methodName", ...); 

// pass the first arg as null to invoke a static method 
staticMethod.invoke(null, ...); 
संबंधित मुद्दे