深入剖析Classloader(一)--类的主动使用与被动使用
主动使用(六种)
1) –创建类的实例 (如new Integer())
2) –访问某个类或接口的静态变量,或者对该静态变量赋值 (读写静态变量)
3) –调用类的静态方法
4) –反射(如Class.forName(“com.yhj.jvm.classloader.ClassLoaderTest”))
5) –初始化一个类的子类 (初始化子类的过程中会主动使用父类的构造方法)
6) –Java虚拟机启动时被标明为启动类的类(含有main方法并且是启动方法的类)
除了以上六种情况,其他使用Java类的方式都被看作是对类的被动使用,都不会导致类的初始化 (除了上述6种情况以外,都不会执行初始化,只会执行加载和连接)
加载.class文件有几种方式
–从本地系统中直接加载 (直接加载本地硬盘上的.class文件加载)
–通过网络下载.class文件 (通过java.net.URLClassLoader加载网络上的某个.class文件)
–从zip,jar等归档文件中加载.class文件 (引入外部zip、jar包)
–从专有数据库中提取.class文件 (不常用)
–将Java源文件动态编译为.class文件 (动态代理)
1.通过子类访问父类的static 变量,不会导致子类的初始化
2.定义引用数组,不会初始化累
obj[] ojbs = new obj[10]
3.final修饰的常量会在编译期间放到常量池中,不会初始化类
4.final修饰的复杂类型,在编译期间无法计算得出,会初始化类
网友评论