我很难将目录的类路径设置为类包。我试图运行一个将目录作为命令行参数的jar文件。该程序使用该目录访问文件夹中的类文件,并使用反射来探索类字段和方法。
final File folder = new File(args[0]);
classList = dirParse.listFilesForFolder(folder);
然后我浏览classList,获取每个类的名称,并使用Class.forName()
方法访问类。
Class c = Class.forName(className);
要使上面的行工作,我必须将类路径设置为包含类的目录的地址。
当我使用不属于下面的包的类目录时,我可以让程序运行得很好:
java -cp "Explorer.jar:/Users/john/Desktop/TestClass/" explorer.ExplorerDemo /Users/john/Desktop/TestClass/
但是,对于以下行,monopoly是一个包,程序在调用ClassNotFoundException
之后抛出Class.forName(className)
java -cp "Explorer.jar:/Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/" explorer.ExplorerDemo /Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/
出于测试目的,我尝试调整`Class.forName()调用以包含如下所示的包名:
Class c = Class.forName("monopoly."+className);
但是,这也会引发ClassNotFoundException
。
答案 0 :(得分:0)
Class.forName
是在当前类的ClassLoader上下文中获取类信息的快捷方式。 Javadoc声明这相当于
Class.forName(" Foo",true,this.getClass()。getClassLoader())
如果您的类目录是作为运行时参数提供的,并且不是原始类路径的一部分,我建议您实例化将指向您的目录的自定义URLClassLoader
实例。
示例代码:
public class ReflectionClassAnalysis {
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException {
// URLClassLoader supports both directories and jar files
Path directory = Paths.get("/some/directory/");
Path jar = Paths.get("/some/binary.jar");
// You may be interested in providing parent ClassLoader for your new instance
// You can either use current class ClassLoader like
ClassLoader contextClassLoader = ReflectionClassAnalysis.class.getClassLoader();
// or current thread ClassLoader
// ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader myClassLoader = new URLClassLoader(
new URL[]{
directory.toUri().toURL(),
jar.toUri().toURL()
},
contextClassLoader
);
// You may use ClassLoader directly to load class meta
Class<?> externalClass = myClassLoader.loadClass("your.class.name");
// or supply ClassLoader to forName method
// Class.forName("your.class.name", true, myClassLoader);
// Do your class analysis here
}
}
对于带有类路径说明的JAR,请参阅:Run a JAR file from the command line and specify classpath