jvm中Class装载系统
- Class文件加载过程
- ClassLoader的工作模式
- 文件加载过程
加载----->连接----->初始化
其中连接过程包括验证、准备、解析
1.1 类装载的条件- 创建一个类的实例时,使用new 或者反射、克隆、反序列化
- 当调用类的静态方法时,及当使用了字节码invokestatic指令
- 当使用类或者接口的静态字段时(final常量除外),如getstatic putstatic指令
- 使用java.lang.reflect包中的方法反射类的方法时
- 当初始化子类时,要求先初始化化父类
- 作为启动虚拟机,还有main()方法的那个类
以上几种属于主动使用情况。被动使用不会引起类的初始化。
一个主动引用的例子:
public class Parents{
static{
System.out.println("init parent");
}
}
public class Child extends Parents{
static {
System.out.println("init child");
}
}
public class Test{
public static void main(String[] args){
Child c = new Child();
}
}
会有如下的输出
init parent
init child
可知系统首先装载Parent,然后装载Child。可以看出符合主动装载的两个条件:使用new 及初始化子类时,必须先初始化父类。
一个被动引用的例子
public class Parents{
static{
System.out.println("init parent");
}
public static int a=10;
}
public class Child extends Parents{
static {
System.out.println("init child");
}
}
public class Test{
public static void main(String[] args){
System.out.println(Child.v);
}
}
输出结果为:
init parent
10
可知引用一个字段时,只有直接定义该字段的类,才会被初始化。
网友评论