我正在尝试从位于Desktop目录中的某个已编译的类文件中加载一个类对象。
我在我的程序中输入两个main参数,它使用URLClassLoader
从编译文件TheClassToLoad.class
中获取类的实例。
我在classLoading程序的主要部分:(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
我发现了一个引发异常:
线程中的异常" main" java.lang.ClassNotFoundException:TheClassToLoad.class
因此,TheClassToLoad.class
中有一个文件Desktop/
,URLClassLoader
会引发异常而不提供调试情况所需的详细信息。
我是Java新手,我知道像com.company.Class
这样的类路径经常需要根据包目录结构来引用类的真正类名。但是,在这种情况下,我只需要URLClassLoader
给我一个类对象的实例,用于位于机器某处的任意编译类文件。
答案 0 :(得分:1)
对于URLClassLoader,URL应该是包含类+包结构的目录,而不是类文件本身。在您的情况下,它应该是file:///Users/Me/Desktop/
。
loadClass的参数应该是类的名称,而不是类文件的名称。在您的情况下,它应该是TheClassToLoad
。
如果类在一个包中(例如,my.pkg.TheClassToLoad
),那么你应该使用该类名作为loadClass的参数,URLClassLoader的URL仍然应该是包结构的根(例如,如果文件为file:///Users/Me/Desktop
,则file:///Users/Me/Desktop/my/pkg/TheClassToLoad.class
。