Call a method dynamically (Reflection)Tag(s): Language


import java.lang.reflect.*;
import java.io.*;

public class TestReflect {

   public static void main(String s[]) throws Exception{
      String aClass;
      String aMethod;
      // we assume that called methods have no argument
      Class params[] = {};
      Object paramsObj[] = {};

      while (true) {
         aClass  = lineInput("\nClass : ");
         aMethod = lineInput("Method: ");
         // get the Class
         Class thisClass = Class.forName(aClass);
         // get an instance
         Object iClass = thisClass.newInstance();
         // get the method
         Method thisMethod = thisClass.getDeclaredMethod(aMethod, params);
         // call the method
         System.out.println
            (thisMethod.invoke(iClass, paramsObj).toString());
      }
      /* Output examples:
            Class : Class1
            Method: class1Method2
            ### Class 1, Method2 ###

            Class : java.util.Date
            Method: toString
            Sat Aug 11 13:18:39 EDT 2007

            Class : java.util.Date
            Method: getTime
            1186852732140      
       */
   }


   public static  String lineInput (String prompt) throws IOException {
     BufferedReader input =
        new BufferedReader(new InputStreamReader(System.in));
     System.out.print(prompt);
     return input.readLine();
   }

}

class Class1 {
   public String class1Method1() {
      return "*** Class 1, Method1 ***";
   }

   public String class1Method2() {
      return "### Class 1, Method2 ###";
   }
}
The next example calls a class method with 2 arguments :
import java.lang.reflect.*;

public class TestReflect {

  public static void main(String[] args) throws Exception {
    TestReflect.invoke("Class1", "say", new Class[] {String.class, String.class},
           new Object[]
             {new String("Hello"), new String("World")});
    /*
      output :
         Hello World
    */
  }

  public static void invoke
     (String aClass, String aMethod, Class[] params, Object[] args)
     throws Exception {
    Class c = Class.forName(aClass);
    Method m = c.getDeclaredMethod(aMethod, params);
    Object i = c.newInstance();
    Object r = m.invoke(i, args);
  }
}

class Class1 {
  public void say( String s1, String s2) {
    System.out.println(s1 + " " + s2);
  }
}  

blog comments powered by Disqus