类加载器以及双亲委派机制

Wenhao 6月前 ⋅ 70 阅读

类加载器(Class Loader) 在Java中,类加载器是负责加载类的对象。Java默认提供了三种类加载器: Bootstrap Class Loader:这是最顶层的类加载器,负责加载JDK内部类,通常是 ​jre/lib​目录下的核心库。 Extension Class Loader:负责加载扩展类,通常是 ​jre/lib/ext​目录下的库。 System Class Loader:负责加载应用程序类路径(classpath)上的类。 双亲委派机制(Parent Delegation Model) 双亲委派机制是Java类加载器的一种工作模式。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父加载器反馈自己无法完成这个加载请求(即它在搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

使用双亲委派模型有以下几个好处: 避免类的重复加载:当父类加载器已经加载了某个类时,子类加载器就不会再加载一次,确保了类的唯一性。 安全:防止核心API库被随意篡改。例如,用户自定义了一个名为 ​java.lang.Object​的类,通过双亲委派模型,这个类不会被加载,因为 ​java.lang.Object​已经在启动类加载器中被加载了。

打破双亲委派机制是为什么 打破双亲委派通常是了实现特定的功能,比如热部署,模块化,但要注意权衡利弊 有可能造成类版本冲突、类型安全问题等

如何打破双亲委派机制 1、在自定义的加载器中重写loadclass方法,在这个方法中可以自定义加载逻辑,不逐级向上委派。这样就打破了双亲委派模型。 2、使用java.lang.ClassLoader的defineClass方法。这个方法允许在运行时将一个字节数组转化为一个类的实例。通过这个方法,也可以绕过双亲委派模型直接在运行时加载类 3.使用Thread.currentThread().setContextClassLoader(),可以动态的改变当前线程的类加载器。通过设置不同的类加载器,可以在特定的代码块中加载不同的类,实现打破双亲委派的效果

总的来说,双亲委派模型是Java类加载器的一种默认和推荐的工作模式,但在某些特定的需求和场景下,开发者可能会选择打破这一机制以实现更灵活和复杂的功能。


全部评论: 0

    我有话说: