有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

设置类路径后,java无法访问目录类

我很难将目录的类路径设置为类包。我正在尝试运行一个jar文件,该文件将目录作为命令行参数。该程序使用目录访问文件夹中的类文件,并使用反射探索类字段和方法

final File folder = new File(args[0]);
classList = dirParse.listFilesForFolder(folder); 

然后我浏览类列表,得到每个类的名称,并使用Class.forName()方法访问这些类

Class c = Class.forName(className);

为了让上面这行工作,我必须将classpath设置为包含类的目录的地址

当我使用不属于以下包的类目录时,我可以让程序正常运行:

java -cp "Explorer.jar:/Users/john/Desktop/TestClass/" explorer.ExplorerDemo /Users/john/Desktop/TestClass/

然而,对于下面的代码行,垄断是一个包,程序在调用Class.forName(className)后抛出一个ClassNotFoundException

java -cp "Explorer.jar:/Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/"  explorer.ExplorerDemo /Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/

出于测试的目的,我试着调整“类”。forName()调用以包含包名,如下所示:

Class c = Class.forName("monopoly."+className);

然而,这也会引发ClassNotFoundException


共 (1) 个答案

  1. # 1 楼答案

    Class.forName是在当前类的类加载器上下文中获取类信息的快捷方式。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