java - 如何使用项目文件之外的类,使用 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 将其作为库导入,如果您在 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() 创建类的实例,如第一个解决方案中所述。
推荐阅读
- sql-server - 在sql Query中使用<>(不等于)时的问题
- python - 具有列表理解的 Pandas 新列和引用现有列的 if 语句
- java - 检查当前日期是否小于到期日期
- ios - SpriteKit,如何从 Adobe After Effects 导入动画
- ssl - 需要有关来自 Java 1.4 客户端的 TLS 1.2 https 服务调用的帮助
- c++ - 如何将位图拉伸到父面板(wxWidgets 自定义)
- oracle - Oracle 中的 AUTHID 是什么?
- vba - 打开文件夹中最新的 PDF
- postgresql - postgres jsonb 类型的最低支持 Rails 版本?
- java - 单击时导航抽屉项目在活动抽屉中不起作用?