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

生成java类并动态调用其方法,java,reflection,Java,Reflection,问题是; 第三个类将从控制台以字符串形式读取类的名称。读取类的名称后,它将自动动态生成该类并调用其writeout方法。如果未从输入读取该类,则不会初始化该类 但我不能再继续了;我需要为3.class做更多的事情,我能做什么?您需要通过类加载器动态加载类。一个简单的方法是使用: package reflection; import java.io.*; import java.lang.reflect.*; class class0 { public void writeout0()

问题是; 第三个类将从控制台以字符串形式读取类的名称。读取类的名称后,它将自动动态生成该类并调用其writeout方法。如果未从输入读取该类,则不会初始化该类


但我不能再继续了;我需要为3.class做更多的事情,我能做什么?

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

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

}

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

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

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

}

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

为了动态生成Java类文件,有一个名为的库,它将在类文件周围包装生成的字节码指令,并将其加载到运行时

不过,您必须学习一些关于Java虚拟机的知识


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

对于动态生成Java类文件,有一个名为的库,它将生成的字节码指令包装在类文件周围,并将其加载到运行时

不过,您必须学习一些关于Java虚拟机的知识


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

继续执行以下操作:

Class.forName(yourClassName);
基本上,一旦找到类,就必须找到要调用的方法,并创建该类的实例,以最终在新实例上调用该方法

要了解更多(更好)这些概念,您应该阅读有关该主题的java教程:


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

继续执行以下操作:

Class.forName(yourClassName);
基本上,一旦找到类,就必须找到要调用的方法,并创建该类的实例,以最终在新实例上调用该方法

要了解更多(更好)这些概念,您应该阅读有关该主题的java教程:


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

到目前为止,您有一个类对象。您需要实例化该类以拥有一个对象来调用方法。一旦获得了所需的实例,就可以通过调用Class对象上的getMethod(String name、Class…parameterTypes)找到所需的方法。如果所有类对“writeout()”方法都具有相同的方法名,这将非常有用,否则您必须确定该方法在类中的名称。以下是调用“writeout()”时缺少的代码:


使用示例中的类和方法命名方案,您可以通过解析类名并提取编号来确定方法名。但是,如果所有类都共享方法名,那么就容易多了。

到目前为止,您有一个类对象。您需要实例化该类以拥有一个对象来调用方法。一旦获得了所需的实例,就可以通过调用Class对象上的getMethod(String name、Class…parameterTypes)找到所需的方法。如果所有类对“writeout()”方法都具有相同的方法名,这将非常有用,否则您必须确定该方法在类中的名称。以下是调用“writeout()”时缺少的代码:


使用示例中的类和方法命名方案,您可以通过解析类名并提取编号来确定方法名。不过,如果所有类都共享方法名,则更容易实现。

供您参考的简单示例:

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

  m.invoke(writerInstance, null);
Class cls_obj=Class.forName(“MyClass.java”);
方法方法=cls_obj.getMethod(“显示”);
Object obj=cls_obj.newInstance();
方法调用(obj);

供您参考的简单示例:

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

  m.invoke(writerInstance, null);
Class cls_obj=Class.forName(“MyClass.java”);
方法方法=cls_obj.getMethod(“显示”);
Object obj=cls_obj.newInstance();
方法调用(obj);

我很高兴知道他的程序中只有10个类。下面是Java反射教程:您可能会发现它很有用。您所说的“生成那个类”是什么意思?实例化该类的对象?@Jacob:你不应该将
run
方法放在类3上,在testclass的
main
方法中有相同的代码是可以的。(顺便说一句,Java类名按惯例以大写开头)我很高兴意识到他的程序中只有10个类。下面是Java反射教程:您可能会发现它很有用。您所说的“生成那个类”是什么意思?实例化该类的对象?@Jacob:你不应该将
run
方法放在类3上,在testclass的
main
方法中有相同的代码是可以的。(顺便说一句,Java类名按约定以大写开头)我想他想先用getMethods检查方法,然后检查writeout是否在,然后实例化对象..但我不明白