参考:
https://blog.csdn.net/javazejian/article/details/73413292
https://blog.csdn.net/ln152315/article/details/79223441
https://zhuanlan.zhihu.com/p/92534103
-
什么是类加载?
编译: 将.java文件编译成.class文件
加载: 将class文件(字节码文件)加载进虚拟机内存,并进行解析生成对应的java.lang.Class对象的过程 -
什么时候会进行类加载?
①调用该类的构造方法 ②调用该类的静态属性或方法 ③使用子类时也会触发父类的加载 -
JVM的类加载机制是什么?
双亲委派机制 类加载器会先让自己的父类来加载,父类无法加载的话,才会自己来加载
①如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
②如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
③如果父类加载器可以完成加载任务,就成功返回,倘若父类加载器无法完成此挤在任务,子加载器才会尝试自己去加载,这就是双亲委派模式。 -
可不可以自己写一个String类?
答:可以但是必须包名不同,因为 根据类加载的双亲委派机制,会去加载父类,父类中有String类了,就不会加载新的String类了 -
能否在加载类的时候,对类的字节码进行修改
答:可以,使用Java探针技术 参考:https://www.cnblogs.com/aspirant/p/8796974.html -
双亲委派的好处
答: ①避免同一个类被多次加载;②每个加载器只能加载自己范围内的类 ③防止核心API被篡改 -
类加载过程
答:加载,连接(验证,准备,解析),初始化 -
tomcat为什么要打破双亲委派机制?
①对于各自的wabapp包,要相互隔离,不能相互影响 ②安全问题,避免恶意破坏 ③热部署 -
JDBC为什么要破坏双亲委派模型? 参考:https://www.jianshu.com/p/60dbd8009c64 及 https://www.sohu.com/a/334000357_505800
答:原生的JDBC中Driver驱动只是一个接口,并没有具体的实现,具体的实现是由不同数据库类型去实现的
原生的JDBC中的类是放在rt.jar包的,是由启动类加载器进行类加载的,在JDBC中的Driver类中需要动态去加载不同数据库类型的Driver类
如MySql中的mysql-connector-.jar中的具体实现就是用户自己写的,就需要用应用程序类去加载.
这个时候就引入线程上下文件类加载器(Thread Context ClassLoader)。
有了这个东西之后,程序就可以把原本需要由启动类加载器进行加载的类,由应用程序类加载器去进行加载了
这是SPI机制 jdk中的基础类作为用户典型的api被调用,但是也存在被api调用用户的代码的情况