Java 在FileWalker中使用ClassLoader时发生ClassNotFoundException
我有一个程序,用户从中选择一个目录开始文件漫游;FileWalker使用Java 在FileWalker中使用ClassLoader时发生ClassNotFoundException,java,classloader,classnotfoundexception,Java,Classloader,Classnotfoundexception,我有一个程序,用户从中选择一个目录开始文件漫游;FileWalker使用类加载器访问目录结构中的每个文件,加载类文件,因此我可以在它们上使用反射在GUI中显示有关该类的信息 如果用户选择具有此结构的文件夹FileReader: D:\Users\Ste\Documents\Eclipse Workspace\Project Tests\File Reader │ ├───+bin │ │ ReadFile.class | │ └───
类加载器
访问目录结构中的每个文件,加载类
文件,因此我可以在它们上使用反射
在GUI中显示有关该类的信息
如果用户选择具有此结构的文件夹FileReader:
D:\Users\Ste\Documents\Eclipse Workspace\Project Tests\File Reader
│
├───+bin
│ │ ReadFile.class
|
│
└───+src
│ ReadFile.java
ClassLoader
加载ReadFile.class
File parentDir = new File(filesPath.getParent().toString());
System.out.println("Parent Directory: " + filesPath.getParent().toString());
但是,如果我在包测试中选择了与添加类相同的目录:
D:\Users\Ste\Documents\Eclipse Workspace\Project Tests\File Reader
│
├───+bin
│ │ ReadFile.class
│ │
│ └───+Test
│ TestClass.class
│
└───+src
│ ReadFile.java
│
└───+Test
TestClass.java
Eclipse抛出一个java.lang.ClassNotFoundException:Test.TestClass
那么为什么我会得到一个java.lang.ClassNotFoundException
?下面是我的代码,其中包含一些System.out.println()
,用于在执行过程中显示一些值。(目录结构与上面的结构相同)
正如您所看到的,它可以找到
ReadFile.class
并很好地加载,但是当我想加载Test.TestClass
时,它会显示ClassNotFoundException
。有什么想法吗???当你走路时TestFile.class
File parentDir = new File(filesPath.getParent().toString());
System.out.println("Parent Directory: " + filesPath.getParent().toString());
在此之后,您有了parentDir=“D:\Users\Ste\Documents\Eclipse Workspace\Project Tests\File Reader\bin\Test”
在此之后,您的类加载器搜索目录为file:///D:/Users/Ste.../bin/Test
这是不正确的(这里没有/Test/TestClass.class
来匹配编译的Test.TestClass
)
在这种情况下,您应该从startingDir+“/bin”
而不是从parentDir
创建类加载器
下面是一个非常基本的示例,以防您需要帮助来了解正在发生的事情。TestClass是否在包测试中?检查文件URL并确保它与类的包匹配。是TestClass在包测试中。我打印出了提供文件的文件url:/D:/Users/Ste/Documents/Eclipse Workspace/Project Tests/file Reader/bin/Test/似乎正确,不是吗?打印出url作为调试的一部分。我猜你的URL是类所在的目录,而它应该是树的根。@parsifal你能举例说明你的意思吗?如果TestClass.class位于D:/Users/Ste/Documents/Eclipse Workspace/Project Tests/File Reader/bin/Test/中,那么URL应该是什么?假设它真的是
Test.TestClass
(如您的示例所示),类路径的根应该是D:/Users/Ste/Documents/Eclipse Workspace/Project Tests/File Reader/bin/
File parentDir = new File(filesPath.getParent().toString());
System.out.println("Parent Directory: " + filesPath.getParent().toString());
URL url = parentDir.toURL();
URL[] urls = new URL[]{url};
//Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);