生成java类并动态调用其方法

时间:2010-03-24 21:30:37

标签: java reflection

package reflection;

import java.io.*;

import java.lang.reflect.*;

class class0
{
  public void writeout0()
  {
    System.out.println("class0");
  }
}

class class1
{
  public void writeout1()
  { 
    System.out.println("class1");
  }
}

class class2
{
  public void writeout2()
  {
    System.out.println("class2");
  }
}

 class class3

{

  public void run()

  {

    try

    {    

        BufferedReader reader= new BufferedReader(new InputStreamReader

(System.in)); 

          String line=reader.readLine(); 

          Class cls=Class.forName(line);
                 //define method here



    }

    catch(Exception ee)

    {

   System.out.println("here "+ee);

    }


  }
  public void writeout3()
  {
      System.out.println("class3");
  }
}

class class4
{
  public void writeout4()
  {
    System.out.println("class4");
  }
}

class class5
{
  public void writeout5()
  {
    System.out.println("class5");
  }
}

class class6
{
  public void writeout6()
  {
    System.out.println("class6");
  }
}

class class7
{
  public void writeout7()
  {
    System.out.println("class7");
  }
}

class class8
{
  public void writeout8()
  {
    System.out.println("class8");
  }
}

class class9
{
  public void writeout9()
  {
    System.out.println("class9");
  }
}



class testclass {

    public static void main(String[] args) {

       System.out.println("Write class name : ");

        class3 example=new class3();

        example.run();
    }

}

问题是; 第三类将从控制台读取类的名称作为String。在读取类的名称后,它将自动动态生成该类并调用其writeout方法。如果该类未从输入中读取,则不会初始化该类。

但我不能继续;我需要更多关于3.class的东西,我该怎么办?

5 个答案:

答案 0 :(得分:2)

到目前为止,您有一个Class对象。您需要实例化该类以使对象调用方法。获得所需的实例后,可以通过调用Class对象上的getMethod(String name,Class ... parameterTypes)找到所需的方法。如果所有类都具有“writeout()”方法的相同方法名称,则会很有用,否则您必须弄清楚该类在该类中的名称。以下是您在调用“writeout()”时缺少的代码:

  Method m = cls.getMethod("writeout", null);
  Object writerInstance = cls.newInstance();

  m.invoke(writerInstance, null);

使用您的示例中的类和方法命名方案,您可以通过解析类名并提取数字来找出方法名称。但是,如果所有类共享方法名称会更容易。

答案 1 :(得分:1)

您需要通过类加载器动态加载类。一个简单的方法是使用:

Class.forName(yourClassName);

获取类对象,然后newInstance()创建该类的新实例。该特定方法仅适用于具有默认构造函数的类。有关更多选项,请参阅Class javadoc。调用构造函数。

答案 2 :(得分:0)

为了动态生成Java类文件,有一个名为Byte Code Engeneering Library (BCEL)的库,它将生成的字节代码指令包装在类文件中并将其加载到运行时。

但是,你必须学习一些关于Java虚拟机的知识。

我建议创建一个包含“writeOut”方法的接口。生成的类需要实现此接口。加载类时,调用方法不需要(很多)反射。您需要的唯一反映是创建生成的类的实例。

答案 3 :(得分:0)

继续使用类似的内容:

//define method here

Method writeout = null;
for( Method m : cls.getDeclaredMethods() ) {
   if( m.getName().startsWith("writeout")) {
       writeout = m;
       break;
   }
}
Object o = cls.newInstance();
writeout.invoke( o );

基本上,一旦找到了类,就必须找到要调用的方法,并创建该类的实例,以便最终在该新实例上调用该方法。

要了解更多(并且更好)所有这些概念,您应该阅读有关该主题的Java教程:The Reflection API

顺便说一句,你不是在这里生成一个类,而是动态地实例化

答案 4 :(得分:0)

供您参考的简单示例:

Class<?> cls_obj = Class.forName("MyClass.java");
Method method = cls_obj.getMethod("show");
Object obj = cls_obj.newInstance();
method.invoke(obj);