2011-08-26 9 views
25
public class Shared { 

    public static void main(String arg[]) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
     Shared s1 = new Shared(); 

     Object obj[] = new Object[2]; 
     obj[0] = "object1"; 
     obj[1] = "object2"; 
     s1.testParam(null, obj); 

     Class param[] = new Class[2]; 
     param[0] = String.class; 
     param[1] = Object[].class; //// how to define the second parameter as array 
     Method testParamMethod = s1.getClass().getDeclaredMethod("testParam", param); 
     testParamMethod.invoke("", obj); ///// here getting error 
    } 

    public void testParam(String query,Object ... params){ 
     System.out.println("in the testparam method"); 
    } 

} 

Ecco l'output:Perché ottengo "l'oggetto non è un'istanza di dichiarazione della classe" quando si richiama un metodo che utilizza la riflessione?

in the testparam method 
Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at pkg.Shared.main(Shared.java:20) 

risposta

48

Quando si richiama un metodo attraverso la riflessione, è necessario passare l'oggetto che si sta chiamando il metodo su come primo parametro a Method#invoke.

// equivalent to s1.testParam("", obj) 
testParamMethod.invoke(s1, "", obj); 
14
testParamMethod.invoke("", obj); ///// here getting error 

Il primo parametro per invocare deve essere oggetto invocare su:

testParamMethod.invoke(s1, "", obj);