如何使用Java中的类路径,使用项目文件之外的类



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

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

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

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

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

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

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

注意:如果类不在类路径中,则不会将其加载到虚拟机中。在这种情况下(如果是编译的(,您必须修改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((创建该类的实例,就像第一个解决方案中所说的那样。

最新更新