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

时间:2016-04-09 18:49:49

标签: java classpath classloader urlclassloader

我正在尝试从位于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给我一个类对象的实例,用于位于机器某处的任意编译类文件。

1 个答案:

答案 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