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");
}
}
出力は次のとおりです。
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)
リフレクション経由でメソッドを呼び出す場合、Method#invoke
の最初のパラメーターとして、メソッドを呼び出しているオブジェクトを渡す必要があります。
// equivalent to s1.testParam("", obj)
testParamMethod.invoke(s1, "", obj);
testParamMethod.invoke("", obj); ///// here getting error
呼び出す最初のパラメーターは、それを呼び出すオブジェクトである必要があります。
testParamMethod.invoke(s1, "", obj);