类的加载?
1、什么是类的加载?(注明:这里引用)
加载Java类到虚拟机中,。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。Java应用的开发人员一般都接触不到类加载器,Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundException和 NoClassDefFoundError等异常。
2、为什么要研究类加载?
我觉得了解这个东西就行了,实际上除了面试一般很少会用到的。综合来说,一般是用于web容器和OSGI。
3、双亲委派模型?
先看缓存中有没有加载到,然后让父加载器来进行加载。系统类加载器-》扩展类加载器-》引导类加载器。直到父加载器没有搜索到,才会让子加载器去加载(这时一般需要重写findClass方法)。
4、自定义加载器
重写findClass方法
过程:读取.class字节流,defineClass定义类。
5、破坏双亲模型
JDBC父加载器加载不了指定类,需要由子加载器去加载;
Tomcat:(注明:这里引用了)
(1)、对于各个 webapp中的 class和 lib,需要相互隔离,不能出现一个应用中加载的类库会影响另一个应用的情况,而对于许多应用,需要有共享的lib以便不浪费资源。
(1)、与 jvm一样的安全性问题。使用单独的 classloader去装载 tomcat自身的类库,以免其他恶意或无意的破坏;
(3)、热部署。相信大家一定为 tomcat修改文件不用重启就自动重新装载类库而惊叹吧。