Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVA中,在运行时在变量中运行名为in的类_Java_Reflection - Fatal编程技术网

在JAVA中,在运行时在变量中运行名为in的类

在JAVA中,在运行时在变量中运行名为in的类,java,reflection,Java,Reflection,我一直在学习Java,在过去的几周里,我创建了一系列用于实践的类。我突然想到,创建一个类会很酷,它允许我查看我创建的所有类的列表,并通过选择我想要的类来运行它们 我做这件事的方式和我走了多远: 我用SimpleFileVisitor在一个HashMap中读取了我所有类的列表 从该列表中,用户可以通过输入与类关联的编号来选择文件 返回一个带有类名的字符串 现在问题来了 例如,我以一个名为Clock.class的字符串结束。 我想运行这个。怎么做 比如说,我知道我想参加的班级。我可以简单地使用C

我一直在学习Java,在过去的几周里,我创建了一系列用于实践的类。我突然想到,创建一个类会很酷,它允许我查看我创建的所有类的列表,并通过选择我想要的类来运行它们

我做这件事的方式和我走了多远:

  • 我用SimpleFileVisitor在一个
    HashMap
    中读取了我所有类的列表
  • 从该列表中,用户可以通过输入与类关联的编号来选择文件
  • 返回一个带有类名的字符串
现在问题来了

例如,我以一个名为
Clock.class
的字符串结束。 我想运行这个。怎么做

比如说,我知道我想参加的班级。我可以简单地使用
Clock.main()
这里的问题是,在运行时之前我不知道运行哪个类,所以我迷路了

我一直在玩弄反射API。我能够实例化Clock.class的一个对象,但什么也没发生

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


这就是我的困境,我希望有人能启发我。:)

您可以通过
SimpleFileVisitor
遍历类文件。将文件名和路径存储在映射中。当用户选择时,让我们假设
Clock.class
获取对应于它的路径并启动另一个java进程

干脆

Process process = Runtime.getRuntime().exec("/pathToJDK/bin/java", pathToClassFile);
您可以处理I/O和错误流,如-

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

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

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); 
Class cls=Class.forName(“package.path.yourClassName”);
方法m=cls.getMethod(“main”,String[].class)//main()的强制签名
字符串[]参数=null;//电话里有人吗?
m、 调用(空,(对象)参数);

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

类文件是否在类路径上?底部的注释不相关。这个网站的人会判断,没有必要添加这样的注释。除此之外,你的问题似乎很好,也很清楚。我建议使用
ProcessBuilder
执行
java
,并传递
.class
文件的路径来执行它。如果您可以实例化它,那么您已经拥有了所需的所有内容。如果要运行静态方法,请在类上调用它。如果要在实例上运行实例方法,则相同。我可能会考虑一种稍微不同的方法,比如使用实现接口的实例,并直接调用接口方法。应该是<代码> /PATotoJDK/bin /java < /C>。顺便说一句,在运行时确定类路径和JVM位置以正确调用JVM可能很方便。是的,很抱歉输入错误。至于查找JVM位置,您可以使用以下代码——在类似的问题中为我工作过。我认为没有必要使用这种方法,因为JVM通常是足够的,不需要找到替代的JDK(它提供自己的JVM)。只需使用系统属性
java.home
java.class.path
。感谢大家抽出时间。按照dognose的指示,我能够实现我的目标,但为了学习,我去测试了你的方法@Aniket Thakur,仍然在学习,我在使用exec()、pathtojava和pathtofile的这些参数时出错。我查了一下,似乎应该传递一个带有命令和任何参数的数组。所以我猜的是:
params[]={“pathToDK/bin/java”,“Clock”}这是否正确?我确实试过了。没有错误,但什么也没有发生。谢谢!这正是我想要的。它工作得很好。非常感谢:)