1.类加载器
Java编译器会为虚拟机转换源指令,虚拟机代码存储以.class为扩展名的类文件中,每一个类文件都包含某个类或者接口定义和代码实现。这些类文件必须由一个解释器进行解释,该解释器能够将虚拟机的指令集翻译成目标机器的机器语言。
引导类加载器:这个加载器不是一个Java类,负责加载在JAVA_HOME下lib目录中的类库,这些属于核心类。由于引导类加载器不属于Java类库,无法被Java程序直接引用,也没有办法可以调用。
扩展类加载器:负责加载JAVA_HOME下lib目录下的jar包,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
系统类加载器:负责加载用户类路径上所指定的类库,可以被直接使用。如果未自定义类加载器,默认为该类加载器,是我们最常用的类加载器。
自定义加载器:只需要继承java.lang.ClassLoader类,然后重写findClass(String name)方法即可,在方法中指明如何获取类的字节码流。
2.双亲委派机制
当一个类加载器接收到类加载请求时,会先请求其父类加载器加载,逐层上升,当父类加载器反馈自己无法完成这个类的请求时(根据类的全限定名称搜索全范围),子类加载器才会尝试去加载。一小孩见到一只小狗,问他爸爸小狗叫什么?他爸不知道,他把去问他爷爷;他爷爷也不知道,于是小孩给小狗取名字叫小哈。
3.为什么要使用双亲委派机制?
双亲委派机制解决了Java基础类统一加载的问题,通过不同的加载器,可以加载相同名称的类。因为所属的类在不同包下,也就是被不同加载器所加载,等于加上一层隔离可以非常清楚的区分名称相同的类。
4.什么地方破坏了双亲委派机制?
因为类加载器受到加载范围的限制,在某些情况下,父类无法直接加载到所需的类文件,需要委托其子类去加载该类文件。
Tomcat破坏了双亲委派机制,每一个tomcat的webappClassLoader加载自己的目录文件,并不会传递给父类加载。
5.JVM 加载class文件的原理机制?
jvm中类的加载时是由类加载器和子类加载器一起实现的,主要的步骤:
查找和导入所有的父类(并不会一次加载所有的类,而是动态加载);
连接:
检查载入的class文件数据是否正确;
为类的静态变量分配存储空间,初始化为默认值;
解析 将类中的符号引用转换为直接引用初始化:
初始化静态变量、静态代码块、类初始化;
执行class类文件
销毁6.什么是Java序列化,怎么实现序列化?
将数据持久化到硬盘上或者用于网络传输,实现serializable接口,定义一个静态常量serial 值。
7.可以自定义已有的类,例如java.lang.String?
根据面描述我们可以知道的是,双亲委派模式是可以被破坏的,虚拟机并不强制实现双亲委派模式。自定义已有的类是可行的,但在自加载定义类就需要自定义加载器加载,否则会先被父类加载器所加载。一般来说,不建议这样做,这样做会有很多潜在问题出现,导致原先使用的类出现问题。
package java.lang;
public class String{
public static void main(String[] args){
System.out.print("you get it ?")
}
}// java.lang.NoSuchMethodError.main