2011-04-07 11 views
14

के आमंत्रण के लिए स्पष्ट रूप से डाला जाना चाहिए, कृपया निम्नलिखित उदाहरण देखें, getMethod() पर पहली कॉल ग्रहण में चेतावनी उत्पन्न करती है। दूसरा काम नहीं करता है और NoSuchMethodException के साथ विफल रहता है।टाइप नल का तर्क स्पष्ट रूप से कक्षा <?> [] को varargs विधि

The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getMethod(String, Class<?>...) from type Class<Example> . It could alternatively be cast to Class for a varargs invocation.

मैंने चेतावनी का पालन किया और अब कुछ भी काम नहीं किया।

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null) 
     at java.lang.Class.getMethod(Class.java:1605) 
     at Example.main(Example.java:12) 

किसी ने मुझे इस व्यवहार की व्याख्या कर सकते:

import java.lang.reflect.Method; 


public class Example 
{ 
    public void exampleMethod() { } 

    public static void main(String[] args) throws Throwable 
    { 
    Method defaultNull = Example.class.getMethod("exampleMethod", null);   
    Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null); 
} 
} 

दूसरी कॉल इस त्रुटि पैदा करता है? चेतावनी से बचने का सही तरीका क्या है?

उत्तर

36

getMethod विधि का दूसरा पैरामीटर एक VarArg तर्क है। सही उपयोग है: यदि प्रतिबिंबित विधि में कोई पैरामीटर नहीं है, तो कोई दूसरा पैरामीटर निर्दिष्ट नहीं किया जाना चाहिए। परिलक्षित विधि पैरामीटर है, इसलिए प्रत्येक पैरामीटर अगले रास्ते में निर्दिष्ट किया जाना चाहिए, तो:

import java.lang.reflect.Method; 


public class Example { 

    public void exampleMethodNoParam() { 
     System.out.println("No params"); 
    } 

    public void exampleMethodWithParam(String arg) { 
     System.out.println(arg); 
    } 

    public static void main(String[] args) throws Throwable { 
     Example example = new Example(); 
     Method noParam = Example.class.getMethod("exampleMethodNoParam"); 
     Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class); 
     noParam.invoke(example); 
     stringParam.invoke(example, "test"); 
     //output 
     //No params 
     //test 
    } 
} 

अद्यतन

तो, आपके मामले में, जब आप null निर्दिष्ट संकलक पता नहीं है क्या टाइप करें जो आप निर्दिष्ट करते हैं। जब आप एक वर्ग है जो अज्ञात है, लेकिन वैसे भी एक वर्ग है करने के लिए null कास्ट करने के लिए प्रयास करते हैं, आप एक अपवाद है क्योंकि exampleMethod का कोई

public void exampleMethod(Class<?> object) { }

हस्ताक्षर है वहाँ मिलता है।

+0

एक जाली 'शून्य' कैसे एक अनदेखा 'शून्य' से अलग होता है? मैं इसे जेडीके स्रोत कोड में नहीं देख सकता। – codevour

+0

कृपया अद्यतन पोस्ट पर देखें। – StKiller

1

आपने null को Class<?>[] पर नहीं डाला, तो आपने इसे Class<?> पर डाला। चूंकि कोई विधि उस हस्ताक्षर से मेल नहीं खाती है, इसलिए यह अपवाद फेंकता है। सरणी की सही पहचान करने के लिए अपनी कास्ट सही करें।

+0

भले ही नल को कक्षा पर रखा गया हो [] मुझे नहीं लगता कि यह काम करेगा ... फिर प्रतिबिंब ऑब्जेक्ट्स की एक सरणी के साथ एक विधि की तलाश करेगा? जो भी मौजूद नहीं है। – mmccomb

4

getMethod जावा एपीआई में परिभाषित किया गया है:

:

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

विधि आप बुलाया कोई तर्क हैं, तो आप एक खाली सरणी या दूसरे argument.like इस के लिए 0 लंबाई के साथ एक सरणी की आपूर्ति करना चाहिए

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]); 

विधि को आमंत्रित करें आपको एक खाली सरणी भी सेट करनी चाहिए।

defaultNull.invoke(example , new Object[0]); 
संबंधित मुद्दे