Java 在FileWalker中使用ClassLoader时发生ClassNotFoundException

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 | │ └───

我有一个程序,用户从中选择一个目录开始文件漫游;FileWalker使用
类加载器
访问目录结构中的每个文件,加载
文件,因此我可以在它们上使用
反射
在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);