在JAVA中运行时在变量中运行名称在其中的类

时间:2015-01-31 15:46:20

标签: java reflection

我一直在学习Java,在过去的几周里,我为实践目的创建了一堆类。它让我觉得创建一个允许我查看我创建的所有类的列表并通过选择我想要的类来运行它的类很酷。

我这样做的方式以及我走了多远:

  • 我使用SimpleFileVisitor读入了HashMap<Integer,String>所有类的列表。
  • 从此列表中,用户可以通过输入与班级相关联的号码来选择文件。
  • 返回带有班级名称的字符串。

现在问题来了。

我最后以一个名为Clock.class的字符串结束。 我想跑这个。怎么样?

让我说我知道我想要上课。我可以简单地使用Clock.main() 这里的问题是我不知道在运行时运行哪个类,所以我迷路了。

我一直在使用Reflection API。我能够实例化Clock.class的一个对象,但没有任何反应。

也许我根本不应该使用反射?也许有一种更简单的方法?

这是我被困的地方,我希望有人可以开导我。 :)

2 个答案:

答案 0 :(得分:2)

您可以使用反射来调用类的主方法:

Class<?> cls = Class.forName("package.path.yourClassName");
Method m = cls.getMethod("main", String[].class); //mandatory signature for main()
String[] params = null; // any params on the call?
m.invoke(null, (Object) params); 

注意:invoke()的第一个参数是您要调用该呼叫的实例。但静态方法并不属于实例,因此使用null

答案 1 :(得分:1)

通过SimpleFileVisitor遍历您的类文件的文件路径。将文件名和路径存储在Map中。当用户选择时,让我们说Clock.class获取与之对应的路径并启动另一个java进程。

简单地做

Process process = Runtime.getRuntime().exec("/pathToJDK/bin/java", pathToClassFile);

您可以使用I / O和错误流,例如 -

InputStream inputStream= process .getErrorStream();
//print this stream