1 class的装载流程
加载--->链接----->初始化
(1)加载:
取得类的二进制流,转化为方法区的数据结构,生成java.lang.Class对象
(2)链接:
验证:保证class的格式是正确的。
文件格式验证
元数据验证
字节码验证
符号引用验证
准备:
分配内存,并为类设置初始值(方法区中)
除了final变量其他都是默认初始值
解析:
将符号引用替换为直接引用(将字符串代表的变量变化为直接引用)
(3)初始化
执行类构造器<clinit>
static变量赋值语句
static{}块
子类的clinit调用前要保证父类的先被调用
<client>是线程安全的
2classLoader
classLoader实例负责将java字节码读入到jvm中
classloader可以定制,满足不同的字节码获取方式
classloader负责类装载过程中的加载阶段
classloader中中重要的方法
1 public Class<?> loadClass(String name) throws ClassNotFoundException载入并返回一个类
2protected final Class<?> defineClass(byte[] b,int off,int len)定义一个类不公开调用
3protected Class<?> findClass(String name) throws ClassNotFoundEXception:回调方法自定义ClassLoader的推荐方法
4protected final Class<?> findLoadedClass(String name):寻找已经加载的类
classLoader分类
BootStrap ClassLoader(rt.jar)
Extension ClassLoader(lib/ext/*.jar)
Application ClassLoader(系统classloader,应用classloader)应用程序的classpath
Custorm ClassLoader(自定义ClassLoader)
自底向上查找类是否已加载
自顶向下去加载查找的类
双亲委派模式,bootsrapclassloader无法加载applicationclassloader加载的类
Thread.getContextClassLoader()
Thread.setContextClassLoader()
上下文类加载器是一个角色(所有的classloader都可以成为上下文加载器)
上层的类加载器,使用上下文类加载加载自己不能加载的类
热替换