设置classpath后无法访问目录类

时间:2017-11-22 17:08:29

标签: java classpath

我很难将目录的类路径设置为类包。我试图运行一个将目录作为命令行参数的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

1 个答案:

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