web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens "l'objet n'est pas une instance de déclaration de classe" lorsque j'appelle une méthode en utilisant la réflexion?

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

}

Voici la sortie:

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)
30
Pratik

Lorsque vous appelez une méthode via la réflexion, vous devez passer l'objet sur lequel vous appelez la méthode comme premier paramètre à Method#invoke.

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

Le premier paramètre à invoquer doit être l'objet sur lequel l'invoquer:

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