之间有什么区别
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
必须位于ClassLoader
的ClassA
或其父级的类路径上。
线程上下文ClassLoader
是一个特殊的上下文,它是当前正在运行的线程的当前ClassLoader
。这在多类加载器环境中很有用。可以从ClassLoader C
中的类创建对象,然后将其传递给ClassLoader D
拥有的线程。在这种情况下,如果对象要加载自身Thread.currentThread().getContextClassLoader()
上不可用的资源,则需要直接使用ClassLoader
。