我想知道为什么Java为线程引入了contexClassLoader。我知道它通常被框架和应用程序服务器使用,它们必须动态地查找和加载类。
但是我不明白为什么Java只是通过添加将保存必要类加载器的字段来实现相同的功能时引入了contexClassLoader。
class ThreadWithCustomClassloader extends Thread
{
ClassLoader threadClassLoader;
public void run()
{
//use threadClassLoader to dynamically find and load classes
}
}
答案 0 :(得分:0)
我很困惑 - 拥有类加载器的实例变量正是Thread类用来实现它的。你的解决方案有什么不同?
你介意这个二传手吗?设置类加载器对于能够为完全不同的环境(Web应用程序)重用相同的线程(例如在servlet容器中)非常重要。线程实例被认为是昂贵的......
答案 1 :(得分:0)
JVM中的默认类加载器机制是父委托,线程上下文类加载器提供了围绕类加载委派方案的后门。 以JNDI为例:它的内容由rt.jar中的引导类(从J2SE 1.3开始)实现,但这些核心JNDI类可能加载由独立供应商实现并可能部署在应用程序的-classpath中的JNDI提供程序。此方案要求父类加载器(在本例中为原始类加载器)加载对其子类加载器之一可见的类(例如,系统类)。 正常的J2SE委派不起作用,解决方法是使核心JNDI类使用线程上下文加载器,从而有效地“隧穿”通过类加载器层次结构,方向与正确的委托相反。
有关详细信息,请查看which class loader should you use