sid*_*ani 11 java multithreading classloader
你能告诉我它之间的区别是什么Thread.currentThread().getContextClassLoader(),TestServlet.class.getClassLoader()不要把它标记为重复,请解释并告诉我何时使用这些
Java文件:
package com.jar.test;
public class TestServlet {
public static void main(String args[]) {
ClassLoader cls = TestServlet.class.getClassLoader().loadClass(
"com.jar.test.TestServlet");
ClassLoader cls = Thread.currentThread().getContextClassLoader()
.loadClass("com.jar.test.TestServlet");
}
}
Run Code Online (Sandbox Code Playgroud)
Thread.currentThread().getContextClassLoader()
返回上下文
ClassLoader此Thread.上下文ClassLoader由线程的创建者提供,供加载类和资源时在此线程中运行的代码使用.如果未设置,则默认ClassLoader为父线程的 上下文.ClassLoader原始线程的上下文通常设置为用于加载应用程序的类加载器.
Class#getClassLoader()
返回类的类加载器.某些实现可能用于
null表示引导类加载器.null如果此类由引导类加载器加载,则此方法将在此类实现中返回 .
简而言之:
Thread.currentThread().getContextClassLoader()是ClassLoader已设置的线程的上下文setContextClassLoader(ClassLoader cl).想象一下,您有一个具有层次结构的复杂Java应用程序ClassLoader(例如Application Server),并且您希望当前线程从此ClassLoader层次结构中的一个特定加载类或资源,您可以通过简单地将ClassLoader线程的上下文设置为这具体ClassLoader.
Class#getClassLoader()只是ClassLoader您的实例Class已加载.
Thread.currentThread().getContextClassLoader()
这是当前线程类加载器,不依赖于调用它的类
TestServlet.class.getClassLoader()
这是加载 TestServlet 类的类加载器。
请解释并提供示例何时使用这些
假设您有 ClassLoader1 拥有的 Thread1 和 ClassLoader2 拥有的 Thread2。您可以在 Thread2 上加载 TestServlet 类(通过 ClassLoader2),然后将其传递给 Thread1。此时,如果 TestServlet 需要加载 ClassLoader1 拥有的类,它将需要使用 Thread.currentThread().getContextClassLoader(),因为它自己的 ClassLoader 是 ClassLoader2 而不是 ClassLoader1。
| 归档时间: |
|
| 查看次数: |
6898 次 |
| 最近记录: |