Java双亲委派机制

news/2024/12/22 19:02:13/

编译器编译.java产生.class 类加载器加载.class到JVM
ClassLoder在加载.class过程中会使用双亲委派机制加载
双亲委派机制

  • BootStrapClassLoader 启动类加载器 在jvm启动时创建 加载$JAVA_HOME/jre/lib中类库 或通过参数-Xbootclasspath指定库 由于引导类加载器涉及到虚拟机本地实现细节 无法直接获取到启动类加载器引用 不能直接操作
  • ExtClassLoader 扩展类加载器 为sun.misc.Launcher中的内部类 加载$JAVA_HOME/jre/lib/ext中类库 或者通过参数-Djava.ext.dirs指定库
  • AppClassLoader 应用程序类加载器 为sun.misc.Launcher中的内部类 加载java环境变量CLASSPATH指定路径中类库 而CLASSPATH所指定路径可通过System.getProperty(“java.class.path”)获取 该变量也可通过参数-cp覆盖
  • CustomClassLoader 自定义类加载器 如tomcat的StandardClassLoader 大部分情况使用AppClassLoader可满足需求

类实例化时执行过程如下

  • 通过ExtClassLoader.getExtClassLoader()创建了ExtClassLoader
  • 通过AppClassLoader.getAppClassLoader(ExtClassLoader)创建AppClassLoader 并将ExtClassLoader设为AppClassLoader的父ClassLoader
  • 通过Thread.currentThread().setContextClassLoader(loader)把AppClassLoader设为线程的上下文ClassLoader
  • 根据jvm参数-Djava.security.manager创建安全管理器 设置系统属性java.security.manager为空字符串

ClassLoader双亲委派机制

  • 当AppClassLoader加载class时 不会自己去尝试加载这个类 而把类委派给父类加载器ExtClassLoader加载
  • 当ExtClassLoader加载class时 不会自己去尝试加载这个类 而把类委派给父类加载器BootStrapClassLoader加载
  • 如BootStrapClassLoader加载失败(如在$JAVA_HOME/jre/lib中未找到该class) 会使用ExtClassLoader加载
  • 若ExtClassLoader加载失败 会使用AppClassLoader加载 如AppClassLoader加载失败 则抛出异常ClassNotFoundException

双亲委派机制特点

安全 如 ClassLoader加载的class文件来源很多 编译器编译生成 或网络下载 自定义java.lang.Integer类覆盖jdk中默认Integer类
初始化自定义integer类时总会退出jvm 破坏程序运行 如使用双亲委派机制该Integer类永远不会被调用 只会加载源码中的类

package java.lang;public class Integer {public Integer(int value) {System.exit(0);}public static void main(String... args) {Integer i = new Integer(1);System.err.println(i);}
}

快速 Bootstrap已经加载过某类 其它类加载器再加载此类时会委托Bootstrap加载 Bootstrap直接返回内存中的实例 而不需重新加载 因此内存中只有一份类字节码对象


http://www.ppmy.cn/news/544232.html

相关文章

GEAK Eye root教程_方法

GEAK Eye的root教程在这里整理了一下,之前有机友说自己的手机想删除系统自带的一些无用软件,可是怎么也删除不了,所以需要先进行root才可以删除,不然的话是 删除不了的,这个方法也是大家在root过程中总结出来了&#x…

极客”一词,来自于美国俚语“geek”的音译,一般理解为性格古怪的人

起源 “ 极客”一词,来自于美国俚语“ geek”的音译,一般理解为性格古怪的人。数学“极客”大多是指,并不 一定是数学专业但又对数学等技术有狂热的兴趣并投入大量时间钻研的人。又 译作“ 奇客”。以前是对那些残忍的 马戏表演者和令人厌恶的…

HTTP状态码401和403的区别

401 Unauthorized:该HTTP状态码表示认证错误,表示这个请求没有被服务器认证或者客户端传送的证书错误,可以修改后在进行重试 403 Forbidden :该HTTP状态码关于授权的,跟应用的的逻辑有关,表示客户端没有权…

POST请求返回:401 Unauthorized

Postman 做接口测试,提交请求后,模拟获取数据,输入入参正确时,却返回status:401 Unauthorized 原因: Authorization 认证不通过,有些Authorization含有有效时长限制。 解决办法: 修改请求头部…

服务器发送了 HTTP 状态代码 401: Unauthorized

根据wsdl连接生成客户端代码,调用接口报错:服务器发送了 HTTP 状态代码 401: Unauthorized。查询此错误的原因是没有访问权限,想到客户再提供接口wsdl访问连接的时候提供了用户名和密码。 解决办法: 增加此类 在接口运行前增加此…

解决“HTTP Error 401 – Unauthorized”

解决“HTTP Error 401 – Unauthorized” cowbird 2005-03-04 近日调用webService的时候,有时会报"HTTP Error 401 – Unauthorized "。 查了查文档结果使用下面的写法,可以解决上面的问题。 AuthorsWebClient.localhost.AuthorsService ws n…

接口报错401 状态码 Unauthorized

接口报错401 状态码 Unauthorized 接口报错401 状态码 Unauthorized 报错原因 状态码 401一般指认证发生错误,需要排查认证的参数及获取方式是否正确 解决办法 如果请求需要带token才能访问,检查一下token的参数名称、以及参数值是否都正确。 有些接…

prometheus的401、403报错处理

当prometheus监控出现下列情况: 该问题的原因是webhook的授权地址使用的是127.0.0.1,所以其他IP发起的请求都会被拒绝,将该地址改为0.0.0.0,然后在controller和scheduler上允许数据请求。 1、在master节点操作 #先备份下列文…