类的加载
Posted hapyygril
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的加载相关的知识,希望对你有一定的参考价值。
1.加载
2.连接
(1)校验:
查看字节码的数据是否以“cafe”开头
jdk版本是否可以运行字节码的数据
(2)准备
成员变量赋默认值
常量(final)
(3)解析
String -->String类型对应的class地址
3.初始化<clinit>类初始化
(1)静态变量的显式初始化代码,赋值代码
(2)静态代码块
当一个类初始化时,如果父类没有初始化,则先初始化父类
每一个类只会初始化一次
类的初始化:
(1)main方法所在的类在加载时,直接先初始化
(2)new一个类的新对象
(3)调用该类的静态变量(final除外)和静态方法
(4)使用java.lang.reflect包的方法对类进行反射调用
(5)初始化一个类时,父类初始化
不会导致类的初始化
(1)静态变量(final)
(2)子类访问父类的静态域,Son.name
(3)通过数组定义类引用
package project05; /*类加载: 1.加载 2.连接 (1)校验: 查看字节码的数据是否以“cafe”开头 jdk版本是否可以运行字节码的数据 (2)准备 成员变量赋默认值 常量(final) (3)解析 String -->String类型对应的class地址 3.初始化<clinit>类初始化 (1)静态变量的显式初始化代码,赋值代码 (2)静态代码块 当一个类初始化时,如果父类没有初始化,则先初始化父类 每一个类只会初始化一次 类的初始化: (1)main方法所在的类在加载时,直接先初始化 (2)new一个类的新对象 (3)调用该类的静态变量(final除外)和静态方法 (4)使用java.lang.reflect包的方法对类进行反射调用 (5)初始化一个类时,父类初始化 不会导致类的初始化 (1)静态变量(final) (2)子类访问父类的静态域,Son.name (3)通过数组定义类引用 */ public class test03 { static { //1.main方法所在的类在加载时,直接先初始化 //System.out.println("main方法的类初始化");//main方法的类初始化 } public static void main(String[] args) { //2.new一个类的新对象 //Father my=new Father();//父类静态代码块--> 父类非静态代码块 //3.调用该类的静态变量(final除外)和静态方法 //System.out.println(Father.name);//父类静态代码块--> null //5.初始化一个类时,父类初始化 //Son son =new Son();//父类静态代码块 --> 子类静态代码块--> 父类非静态代码块 //1.静态变量(final) //System.out.println(Son.hobby);//banana //2.子类访问父类的静态域 //System.out.println(Son.name);//父类静态代码块-->zhang //3. Father [] arr=new Father[5]; } } class Father{ public static String name="zhang"; public static final String hobby="banana"; static { System.out.println("父类静态代码块"); } { System.out.println("父类非静态代码块"); } } class Son extends Father{ static { System.out.println("子类静态代码块"); } }
以上是关于类的加载的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段