https://time.geekbang.org/column/article/11523
java的语言类型分为基本类型(primitive types)和引用类型(reference types),其中引用类型还细分为接口,类,数组类和泛型参数. 其中泛型会在编译过程中被擦除. 因此java虚拟机中实际上只有三种,在类,接口,数组类中,数组类由虚拟机直接生成,其他两种都具有对应的字节流.
字节流:最常见的是由编译器直接生成的,除此还可以在程序内部直接生成或者从网页中获取(例如网页中内嵌的小程序 Java applet)字节流
以下是类加载的步骤:
加载
加载指查找字节流,并根据这创建类的过程. 对于除了数组类的其他类,虚拟机需要通过类加载器来完成查找字节流的过程
虚拟机中除了启动类加载器(boot class loader)是由C++实现的,其余的类加载器都是java.lang.classloader的子类,需要由其他的类加载器加载到虚拟机中,比如启动类加载器.
类加载器加载字节流时有一个双亲委派模型,指每个类加载器接收到加载请求时,它会将请求转给父-类加载器,在父-类加载器没找到所请求的类,该加载类才会去进行加载,当该类加载器还找不到的情况下会直接报ClassNotFountExption,不会再往下寻找子-类加载器
在java9之前:
启动类加载器(boot class loader)负责加载最基础,最重要的类,比如存放在JRE下lib目录下jar包的类(以及有虚拟机参数Xbootclasspath指定的类).
扩展类加载器(ext class loader)的父-类加载器是启动类加载器,负责加载相对次要但又通用的类,比如放在JRE的lib/ext下的jar包中的类(以及由系统变量java.ext.d