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