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"); 
    } 

} 

Aquí está la salida:¿Por qué obtengo "objeto no es una instancia de declaración de clase" cuando invoco un método que utiliza la reflexión?

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) 

Respuesta

48

Cuando se invoca un método a través de la reflexión, es necesario pasar el objeto al que está llamando el método en el que el primer parámetro a Method#invoke.

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

El primer parámetro para invocar debe ser el objeto para invocar en:

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