生成Java类,并动态地调用它的方法(Generate java class and call it

2019-10-30 04:20发布

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

}

问题是, 第三类将读取类从控制台字符串的名称。 在阅读类的名称,它会自动和动态生成类,并调用它的WriteOut的method.If该类不是从输入读取,它不会被初始化。

但我不能再继续下去了; 我需要更多的东西3.class,我该怎么办?

Answer 1:

到现在为止,你有一个Class对象。 您需要实例化的类有一个对象调用一个方法。 一旦你有你需要的情况下,你可以找到你想要的Class对象上getMethod通话(字符串名称,类... parameterTypes)的方法。 这是有益的,如果所有的类都为“WriteOut的()”方法相同的方法名,否则你必须弄清楚什么方法之类的内部命名。 这里是你错过了拨打电话,以“WriteOut的()”的代码:

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

  m.invoke(writerInstance, null);

随着你在你的例子有类和方法的命名方案,你可以通过分析类名称和提取数找出方法名。 这是容易得多,如果所有的类共享的方法名,虽然。



Answer 2:

你需要通过类加载器动态加载的类。 一个平凡的方式做,这是使用:

Class.forName(yourClassName);

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



Answer 3:

对于动态生成的Java类文件,有一个库,称为字节码Engeneering库(BCEL) ,其将包裹周围产生一个类文件的字节码指令并将其加载到运行时。

你将不得不学习一些有关的Java虚拟机,虽然。

我建议创建一个接口,其中包含“WriteOut的”方法。 生成的类必须实现这个接口。 当加载类,你不需要调用该方法(多)反射。 你唯一需要的反射创建生成的类的实例。



Answer 4:

喜欢的东西继续:

//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教程的主题: 反射API

顺便说一句你是不是在这里产生的一类 ,而是动态的实例化它。



Answer 5:

供您参考简单的例子:

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


文章来源: Generate java class and call its method dynamically