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的东西,我该怎么办?
答案 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);