静态代码块的加载时机及JVM的理解
2018-03-16 00:29
330 查看
学习自:http://blog.csdn.net/jiese1990/article/details/40154329
class MyClass1 {
static {//静态块
System.out.println("static block ");
}
}
public class Main {
Class[] classArray = {
MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
};
public static void main(String[] args){
System.out.println("hello word");
}
}
这个例子,是入口。但是不会创建一个Main对象,也就没有了把成员变量提取到构造方法之前初始化这么一说,所以
Class[] classArray = {
MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
};
就不会被执行到。这个demo测试就有问题了。把这个Class数组声明成静态就可以了。
然后MyClass1.class就会出发了这个类的第一步,加载
所以静态代码块不会得到执行性。
还有一种情况也不会得到执行。当你Class.forName(对象详细路径),这个时候是会触发到初始化的。但是你可以通过设置一个标记位为false
Class.forName("A",false,this.getClass().getClassLoader())
这样就不会进行初始化了。
最后JVM角度捋一捋
1.装载
通过类的完全限定名,生成二进制流
解析二进制流为方法区的内部数据结构
创建Class实例
2.连接
验证语义和符号引用
分配内存
解析,常量池寻找可替换引用
3.初始化:当类被主动使用
主动使用的情形:
创建实例
调用静态方法、字段
反射
初始化某个子类
启动包含main方法的类
class MyClass1 {
static {//静态块
System.out.println("static block ");
}
}
public class Main {
Class[] classArray = {
MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
};
public static void main(String[] args){
System.out.println("hello word");
}
}
这个例子,是入口。但是不会创建一个Main对象,也就没有了把成员变量提取到构造方法之前初始化这么一说,所以
Class[] classArray = {
MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
};
就不会被执行到。这个demo测试就有问题了。把这个Class数组声明成静态就可以了。
然后MyClass1.class就会出发了这个类的第一步,加载
所以静态代码块不会得到执行性。
还有一种情况也不会得到执行。当你Class.forName(对象详细路径),这个时候是会触发到初始化的。但是你可以通过设置一个标记位为false
Class.forName("A",false,this.getClass().getClassLoader())
这样就不会进行初始化了。
最后JVM角度捋一捋
1.装载
通过类的完全限定名,生成二进制流
解析二进制流为方法区的内部数据结构
创建Class实例
2.连接
验证语义和符号引用
分配内存
解析,常量池寻找可替换引用
3.初始化:当类被主动使用
主动使用的情形:
创建实例
调用静态方法、字段
反射
初始化某个子类
启动包含main方法的类
相关文章推荐
- java面试-深入理解JVM(八)——类加载的时机
- 深入理解JVM(八)——类加载的时机
- 深入理解JVM(八)——类加载的时机
- 类的加载顺序及静态代码块的执行时机
- java类的加载 初始化时机,已经静态代码块的执行时机
- 静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢?
- 深入理解JVM(八)——类加载的时机
- 深入理解JVM(八)——类加载的时机
- JAVA虚拟机(JVM)——类加载的时机之类的初始化
- java加载类创建对象的过程以及静态代码段的执行时机
- 深入理解java类加载之类的初始化时机
- JVM学习记录-类加载时机
- Java的静态变量,成员变量,静态代码块,构造块的加载顺序
- Java300StudyNote(7)-JVM核心机制(2)-初始化时机-类的主动引用、被动引用、静态初始化块执行顺序问题
- java基础-静态,非静态(构造)代码块,类加载
- 深入理解JVM-类加载
- Java类中静态代码块、构造代码块、构造函数快速理解
- 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字
- 深入理解JVM(十)——类加载器
- 深入理解JVM(四)-Java虚拟机类加载机制