Listing 8: ClassRunner.java — Illustrates invoking static methods

import java.lang.reflect.*;

class ClassRunner
{
   public static void main(String[] args)
      throws Exception
   {
      // Determine class and arguments for its main
      Class clas = Class.forName(args[0]);
      String[] newArgs = new String[args.length - 1];
      System.arraycopy(args, 1, newArgs, 0, args.length - 1);
      Object[] newArgVals = new Object[] {newArgs};

      // Find its main and invoke it
      Class[] argTypes = new Class[] {String[].class};
      Method mainMethod = clas.getMethod("main", argTypes);
      mainMethod.invoke(null, newArgVals);
   }
}

class Echo
{
   public static void main(String[] args)
   {
      // Echo args
      System.out.println("Running Echo.main:");
      for (int i = 0; i < args.length; ++i)
         System.out.println("\targs[" + i + "] = " + args[i]);
   }
}

/* Output to "java ClassRunner Echo one two three":
Running Echo.main:
    args[0] = one
    args[1] = two
    args[2] = three
*/
— End of Listing —