之间有什么区别

getClass().getResource("some-resource-file.txt")


Thread.currentThread().getContextClassLoader().getResource("some-resource-file.txt")

我在src/test/resources中有资源,我正在尝试从单元测试中访问它们。这是典型的maven样式目录结构。

我期望两者的行为相同。但是事实并非如此。getClass()。getResource()无法获取资源,而从Thread可以获取资源。

那么它们有何不同?

最佳答案

有一个特殊情况使第一个类运行(这就是为什么必须将main()方法声明为静态的,并以字符串数组作为参数的原因)。
加载并运行该类后,类加载器将在以后尝试加载类。最简单的是,类加载器创建由字符串名称引用的类主体的平面 namespace 。 Java中的每个类都使用自己的类加载器来加载其他类。因此,如果ClassA.class引用了ClassB.class,则ClassB必须位于ClassLoaderClassA或其父级的类路径上。

线程上下文ClassLoader是一个特殊的上下文,它是当前正在运行的线程的当前ClassLoader。这在多类加载器环境中很有用。可以从ClassLoader C中的类创建对象,然后将其传递给ClassLoader D拥有的线程。在这种情况下,如果对象要加载自身Thread.currentThread().getContextClassLoader()上不可用的资源,则需要直接使用ClassLoader

10-07 18:58
查看更多