Java虚拟机学习-(4)类加载机制

类的加载过程

 
加载:.class加载到方法区,并生成该类的Class对象。
验证:规范验证,文件格式验证、元数据验证(类验证)、字节码验证(字节码指令、操作数验证)、符号引用验证(找类、方法、修饰符等)。
准备:类变量分配内存。
解析:符号引用变为直接引用,类、接口解析,类方法解析,接口方法解析,字段解析。
初始化:执行<clinit>()类构造器。
 

类加载器

 
BootstrapClassLoader(C++实现),加载rt.jar、resources.jar、charset.jar,可通过-Xbootclasspath指定
ExtentionClassLoader(Java实现,继承URLClassLoader),加载lib/ext目录下的jar与class文件,可通过java.ext.dirs指定
AppClassLoader(Java实现),加载classpath下的jar与class文件
CustomClassLoader,自定义类加载器,支持实现个性化
 
双亲委派机制
 
在类加载时,类加载器先传递给父加载器加载,父加载器加载失败再由自己加载。
 
 

自定义类加载器

 

1.tomcat

 
 
WebAppClassLoader
    1.检查我们先前加载的本地类缓存,加载过就不加载了
    2.通过javase 的 ClassLoader检查源码是否有重复类,有的话就通过javaseLoader加载
    3.通过filter方法判断一些特定的类,如果属于特定的类,就通过父加载器加载
    4.剩余的就自己加载,加载失败的通过父类加载
 
通过以上过程可以看到,如果一个tomcat部署两个应用,分别引用了同一个第三方jar的不同版本,则会走到第4步,优先自己加载,起到隔离作用。
若想覆盖类似于ArrayList的实现,则会被第2步拦住。
 

2.JDBC

    只要引入JDBC的包,就可以加载进来,其加载过程如下:
JDBC的jar中存在META-INF/service/java.sql.Driver中配置了驱动类名(SPI需要),加载类java.util.ServiceLoader的类加载器为Bootstrap ClassLoader,其加载不了java.sql.Driver中配置的类,然后就使用Thread Context ClassLoader中的类加载器加载,而Thread Context ClassLoader中默认放的是AppClassLoader引用,AppClassLoader是可以加载该驱动类。
如何替换JDK的类
-Djava.endorsed.dirs 指定,优先级高于rt.jar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值