【发布时间】:2021-06-18 03:04:54
【问题描述】:
我有一个程序,我希望用户能够从文件系统中选择一个 .java 类文件,然后将该类加载到程序中。
我正在使用 JFileChooser 来允许用户选择文件。然后,我尝试将该文件转换为 URL,并使用 URLClassLoader 加载类(如 these answers 所建议的那样)。
问题是,当我想使用loadClass() 方法时,我不知道该类的“完整类名”(例如java.lang.String)。所以,我不知道如何使这种方法起作用。有没有办法得到这个类名?还是有其他方法可以做到这一点?
这是我的代码示例:
// Open the file chooser
JFileChooser fileChooser = new JFileChooser();
fileChooser.showOpenDialog(null);
File obtainedFile = fileChooser.getSelectedFile();
// Create the class loader from the file
URL classPath = obtainedFile.toURI().toURL();
URLClassLoader loader = new URLClassLoader(new URL[] {classPath});
// Get the class from the loader
Class<?> theClassIWant = loader.loadClass("the file name"); // What do I put here??
【问题讨论】:
-
问题,为什么需要加载文件?它是某种插件系统吗?许多其他应用程序管理它的方式是它们强制每个插件具有特定的结构或包含在 jar 中的元数据文件,其中包含有关 jar 的信息,例如类名和主应用程序需要了解的任何特定功能(请记住,jar 文件只是一个存档文件)。
-
您遇到了循环问题。不加载类不能知道类名,不知道类名就不能加载类。您必须从用户那里获取包和类名信息。
-
您没有命名全名这一事实不仅对于
loadClass的参数来说是一个问题,而且对于为classPath选择正确的父目录也是一个问题。见Initial package of class from another directory...如果要从文件中获取类名,this answer提取限定名,但是,如你所见,并不简单。
标签: java reflection classpath classloader