【问题标题】:Why do we need contexClassLoader为什么我们需要上下文类加载器
【发布时间】:2012-05-10 12:36:54
【问题描述】:

我想知道为什么 Java 为线程引入了 contexClassLoader。我知道它通常由必须动态查找和加载类的框架和应用程序服务器使用。

但是我不明白为什么 Java 引入了 contexClassLoader,因为我们可以通过添加包含必要类加载器的字段来实现相同的功能。

class ThreadWithCustomClassloader extends Thread
{
    ClassLoader threadClassLoader;

    public void run()
    {
       //use threadClassLoader to dynamically find and load classes
    }
}

【问题讨论】:

    标签: java contextclassloader


    【解决方案1】:

    我很困惑 - 类加载器的实例变量正是 Thread 类用来实现它的。您的解决方案有何不同?

    你介意二传手吗?设置类加载器对于能够为完全不同的环境(Web 应用程序)重用相同的线程(例如,在 servlet 容器中)非常重要。线程实例被认为是昂贵的......

    【讨论】:

    • 是的,我的解决方案提供了相同的功能。我很困惑为什么 Java 引入了更改线程类加载器的标准机制,如果你自己做这么简单。
    • 我不明白你帖子的第二部分 - 关于 setter。
    • Java提供了一个标准的机制,因为它经常被使用!
    • 如果它真的被如此频繁地使用,在我看来,最好创建一个新的类来扩展 Thread 以提供必要的功能。
    • 所以,如果您编写的组件不对其上下文做出任何假设,但想要获取其上下文类加载器,您总是必须检查 (instanceof ThreadWithCustomClassloader) 吗?我不明白为什么该功能应该在基本实现中。
    【解决方案2】:

    JVM 中默认的类加载器机制是父委托,线程上下文类加载器为类加载委托方案提供了一个后门。 以 JNDI 为例:它的核心由 rt.jar 中的引导类实现(从 J2SE 1.3 开始),但这些核心 JNDI 类可能会加载由独立供应商实现的 JNDI 提供程序,并可能部署在应用程序的 -classpath 中。这种情况需要一个父类加载器(在这种情况下是原始类加载器)加载一个对其子类加载器之一可见的类(例如,系统类加载器)。 正常的 J2SE 委派不起作用,解决方法是让核心 JNDI 类使用线程上下文加载器,从而有效地“隧道”通过类加载器层次结构以与正确委派相反的方向。

    更多信息请查看which class loader should you use

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 2020-12-17
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多