jvm中的classloader

class装载验证流程:加载、链接(验证、准备、解析)、初始化

加载:

装载类的第一个阶段

取得类的二进制流

转为方法区的数据结构

在java堆中生成对应的java.long.Class对象

链接(验证)

文件格式的验证:(以0xCAFEBABE)开头、版本号是否合理

元数据验证:是否有父类、继承了final类?、非抽象实现了所有的抽象方法

字节码验证:操作数栈的和局部变量是否吻合、跳转指令指定到合理的位置。

符号引用验证:常量池描述类是否存在、访问的方法或字段是否存在且有足够的权限

链接(准备)

分配内存,并未类设置初始值(方法区中)

public static int v=1;在准备阶段中,v会被设置为0。在初始化<clinit>中才会被设置为1

对于static final类型,在准备阶段就会被赋值为正确的值,例如,public static final int v=1。

链接(解析)

符号应用替换为直接引用(指针或者地址偏移量)

初始化

执行类构造器<clinit>

static变量赋值语句,static{}语句

子类的<clinit>调用钱保证父类的<clinit>先被调用

<clinit>是线程安全的

---------

ClassLoader是一个抽象类

ClassLoader的实例将读入Java字节码将类装在到JVM中

ClassLoader可以定制,满足不同的字节流获取方式,网络,文件,本地。

ClassLoader负责类装在过程中的加载阶段

ClassLoader重要方法:

public Class<?> loadClass 

protected final Class<?> defineClass

protected Class<?> findClass

protected final Class<?> findLoadedClass 寻找已经加载的类

至底向上加载加载类,自顶向下尝试加载类。

Bootstrap ClassLoader (rt.jar /-Xbootclasspath classpath设置这个参数下的类也会被bootstrap)

Extension ClassLoader %JAVA_HOME%/lib/ext/*.jar

App ClassLoader Classpath下

Custom ClassLoader

猜你喜欢

转载自peng4602.iteye.com/blog/2367144