2016-04-09 55 views
0

我试图从坐在我的桌面目录中的一些编译的类文件加载类对象。加载外部类文件,而不考虑类路径或包

我在我的程序中给主要两个参数喂食,它使用URLClassLoader从编译文件TheClassToLoad.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

我发现引发异常:

线程“main”中的异常java.la ng.ClassNotFoundException:TheClassToLoad.class

因此,有在Desktop/文件TheClassToLoad.classURLClassLoader抛出一个异常,而不提供我需要调试的情况的详细信息。

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

+1

如果您的班级有'包'语句,您在尝试加载和使用时需要尊重它。 – bmargulies

回答

1

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

loadClass的参数应该是类的名称,而不是类文件的名称。你的情况应该是TheClassToLoad

如果该类在包中(例如,my.pkg.TheClassToLoad),那么你应该使用类名作为参数的loadClass,并为URLClassLoader的网址仍然应该如果封装结构(例如,file:///Users/Me/Desktop根文件是file:///Users/Me/Desktop/my/pkg/TheClassToLoad.class)。

+0

谢谢,不使用“完全指定”类名称是根本原因 –

相关问题