加载外部 class 文件而不考虑 class-路径或包

Loading external class files without regard to class-paths or packages

我正在尝试从位于我的桌面目录中的一些已编译的 class 文件加载 class 对象。

我在我的程序中向 main 提供了两个参数,该程序使用 URLClassLoader 从编译文件 TheClassToLoad.class 中获取 class 的实例。

我有,在class加载程序的主要部分:(args[0] is for something unrelated)

String classFile_FilePath = args[1];
String className = args[2];
URL classUrl = new URL(classFile_FilePath);
URLClassLoader ucl = new URLClassLoader(new URL[]{classUrl});

当运行这个程序来自shell而在项目目录中时:

Me:ClassLoadingProgramRootDir Me$ java com.company.Main argZero file:///Users/Me/Desktop/ TheClassToLoad.class

我发现一个引发的异常:

Exception in thread "main" java.lang.ClassNotFoundException: TheClassToLoad.class

因此,Desktop/ 中有一个文件 TheClassToLoad.class,但 URLClassLoader 引发了异常,但没有提供我需要调试情况的详细信息。

我是 Java 的新手,我知道像 com.company.Class 这样的 class 路径通常需要引用 class 的真实 class基于包目录结构的名称。然而,在这种情况下,我只是被要求 URLClassLoader 给我一个 Class 对象的实例,用于位于机器某处的任意编译的 class 文件。

对于URLClassLoader,URL 应该是包含class+包结构的目录,而不是class 文件本身。在你的情况下,它应该是 file:///Users/Me/Desktop/.

loadClass 的参数应该是 class 的名称,而不是 class 文件的名称。在你的情况下,它应该是 TheClassToLoad.

如果 class 在包中(例如 my.pkg.TheClassToLoad),那么您应该使用 class 名称作为 loadClass 的参数,而 URL对于 URLClassLoader 应该仍然是包结构的根(例如,file:///Users/Me/Desktop 如果文件是 file:///Users/Me/Desktop/my/pkg/TheClassToLoad.class)。