Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get "object is not an instance of declaring class" when invoking a method using reflection?

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

Here is the output:

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) 
like image 884
Pratik Avatar asked Aug 26 '11 09:08

Pratik


1 Answers

When you invoke a method via reflection, you need to pass the object you are calling the method on as the first parameter to Method#invoke.

// equivalent to s1.testParam("", obj) testParamMethod.invoke(s1, "", obj); 
like image 178
Stuart Cook Avatar answered Sep 22 '22 14:09

Stuart Cook