2011-08-14 11 views
11

जावा में किसी वर्ग के लिए कोई विधि मौजूद है या नहीं, यह देखने के लिए कोई कैसे जाएगा? try {...} catch {...} कथन अच्छा अभ्यास होगा?जावा में रनटाइम पर एक विधि मौजूद होने पर कैसे जांचें?

+0

क्या आप प्रतिबिंब का उपयोग कर रहे हैं? अन्यथा, मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं ... – Neil

+0

विधि अस्तित्व के साथ प्रयास करने/पकड़ने का क्या प्रयास है? जब तक आप 'Iterator 'इंटरफ़ेस जैसी स्थिति का जिक्र नहीं कर रहे हैं, जहां' हटाए गए 'के कार्यान्वयन को' असमर्थित ऑपरेशन अपवाद 'फेंकने की अनुमति है? –

+1

आप किस मौजूदा तरीके के बारे में बात कर रहे हैं? प्रतिबिंब? – Jaka

उत्तर

21

मुझे लगता है कि आप विधि doSomething(String, Object) जाँच करना चाहते हैं।

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

boolean methodExists = false; 
try { 
    obj.doSomething("", null); 
    methodExists = true; 
} catch (NoSuchMethodError e) { 
    // ignore 
} 

यह काम नहीं करेगा, क्योंकि विधि संकलन समय पर समाधान हो जाएगा।

आपको इसके लिए प्रतिबिंब का उपयोग करने की ज़रूरत है। और यदि आपके पास जिस विधि को कॉल करना है, उसके स्रोत कोड तक पहुंच है, तो आप जिस विधि को कॉल करना चाहते हैं उसके साथ इंटरफ़ेस बनाना बेहतर है।

[अद्यतन] अतिरिक्त जानकारी है: एक इंटरफ़ेस है जो दो संस्करणों में मौजूद हो सकता है, एक पुराना (वांछित विधि के बिना) और एक नया (वांछित विधि के साथ)। उस आधार पर, मैं निम्नलिखित सुझाव:

package so7058621; 

import java.lang.reflect.Method; 

public class NetherHelper { 

    private static final Method getAllowedNether; 
    static { 
    Method m = null; 
    try { 
     m = World.class.getMethod("getAllowedNether"); 
    } catch (Exception e) { 
     // doesn't matter 
    } 
    getAllowedNether = m; 
    } 

    /* Call this method instead from your code. */ 
    public static boolean getAllowedNether(World world) { 
    if (getAllowedNether != null) { 
     try { 
     return ((Boolean) getAllowedNether.invoke(world)).booleanValue(); 
     } catch (Exception e) { 
     // doesn't matter 
     } 
    } 
    return false; 
    } 

    interface World { 
    //boolean getAllowedNether(); 
    } 

    public static void main(String[] args) { 
    System.out.println(getAllowedNether(new World() { 
     public boolean getAllowedNether() { 
     return true; 
     } 
    })); 
    } 
} 

इस कोड को परीक्षण के लिए कि क्या विधि getAllowedNether इंटरफेस में मौजूद है, तो यह कोई फर्क नहीं पड़ता वास्तविक वस्तुओं विधि हों या न हों।

यदि विधि getAllowedNether को अक्सर कॉल किया जाना चाहिए और आप इसके कारण प्रदर्शन समस्याओं में भाग लेते हैं, तो मुझे एक और अधिक उन्नत उत्तर के बारे में सोचना होगा। यह अभी के लिए ठीक होना चाहिए।

+0

विधि मेरे कोड में नहीं है लेकिन एक लिंक किए गए जार में - क्या यह इसके लिए काम करेगा? – jrtc27

+0

क्या आप कह सकते हैं कि यह कौन सी विधि है? क्या विधि 'इंटरफेस' से आती है, तो आप आसानी से 'exampleof' ऑपरेटर के साथ अपने अस्तित्व से पूछ सकते हैं? –

+0

कंपाइलर आपके द्वारा निर्दिष्ट जारों के माध्यम से जाएगा और सभी विधियों को ढूंढेंगे, अगर इसे कुछ नहीं मिलेगा, तो यह एक त्रुटि संदेश – Jaka

4

जावा में इसे प्रतिबिंब कहा जाता है। एपीआई आपको विधियों को खोजने और रनटाइम पर कॉल करने की अनुमति देता है। यहां दस्तावेज़ों के लिए एक सूचक है। यह बहुत वर्बोज़ वाक्य रचना है, लेकिन यह काम किया प्राप्त करेंगे:

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

+1

लिंक अब काम नहीं कर रहा है। – mikiqex

5

Class.getMethod(...) फ़ंक्शंस का उपयोग करते समय प्रतिबिंब API NoSuchMethodException फेंकता है। ! यदि (शून्य = getDeclaredMethod (:

अन्यथा ओरेकल प्रतिबिंब के बारे में एक अच्छा ट्यूटोरियल http://download.oracle.com/javase/tutorial/reflect/index.html

2

मैं एक अलग विधि का उपयोग अपवाद को संभालने और एक अशक्त जांच के लिए होगा अगर विधि मौजूद है की जाँच करने के

पूर्व है obj, "getId", null)) अपनी सामग्री करें ...

private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) { 
    // TODO Auto-generated method stub 
    try { 
     return obj.getClass().getDeclaredMethod(name, parameterTypes); 
    } catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 
संबंधित मुद्दे