首页 > 解决方案 > 如何使用项目文件之外的类,使用 Java 中的类路径

问题描述

我想制作一个程序,它从用户那里获取类名和类路径,并在运行时编译这个类,并从这个类中生成对象,例如:

String path = "C:\\Users\\classes"; String classname = "test.java"; //compile this class //create new object and use methods

我对这个主题进行了研究,但找不到具体的例子。

标签: javaclass

解决方案


您不能在运行时使用 .java 文件,因为它们尚未编译。您必须找到一个 .class 或 .jar 文件(或将 .java 作为库导入并与项目的其余部分一起编译)。

如果您拥有类的完全限定名称,但由于某种原因在编译时无法访问它,您可以使用Class.forName(package.Class)加载该类,然后调用.getConstructor().newInstance()以访问其默认(无参数)构造函数。结果对象将是该类的一个实例。如果您必须使用此解决方案,我建议您对反射进行一些研究。

如果您将 .java 文件用作库,则可以使用 IDE 将其作为库导入,如果您在 google 上搜索,将会有很多示例。

如果您想在运行时编译该文件,这会有点困难,但您可以使用已安装的 JDK: JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); 或者通过在命令提示符下执行 javac 命令Runtime.getRuntime().exec()。我不会介绍这些的完整解决方案,因为它们太长了,你可以在其他地方找到它们。

注意:如果该类不在您的类路径中,则不会将其加载到虚拟机中。在这种情况下(如果已编译),您必须修改 JVM 参数以覆盖文件。

编辑:通过 javac 进行运行时编译的代码:

Process p = Runtime.getRuntime().exec(javac + " \"" + pathToFile + "\"");
p.waitFor();

这将对您的 java 文件执行 javac 命令并在同一目录中创建一个 .class 文件(我将路径包装在“”中以解决包含空格的路径问题)。

现在您需要加载已编译的类:

URL[] urls = new URL[]{new File(pathToFile).getParentFile().toURI().toURL()};
ClassLoader cl = new URLClassLoader(urls);
Class yourClass = cl.loadClass(className);

然后您可以使用 yourClass.getConstructor().newInstance() 创建类的实例,如第一个解决方案中所述。


推荐阅读