-
类加载内存分析
创建类时,在加载阶段于方区生成以下类中的数据与堆中的class,链接阶段检查数据,此时的变量m为0,初始化阶段为m赋值
-
分析类初始化
- 类的主动引用定会发生类的初始化)
- 当虚拟机启动,先初始化main方法所在的类
- new一个类的对象
- 调用类的静态成员(除了final常量)和静态方法V
- 使用java.lang.reflect包的方法对类进行反射调用
- 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
- 类的被动引用(不会发生类的初始化)
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
-
类加载器
rt.jar包:
打印系统类和扩展类加载器(根类为null):
打印当前类和Object类的Loader:
获取可加载路径:
双亲委派机制:
不能和java自己的包重名,会被覆盖。
-
获取类的运行时结构
可以获取:
-
动态创建对象执行方法
输出的属性都为null或0,因为相当于调用了无参构造器
用构造器创建对象:
通过反射调用方法:
invoke方法激活方法:
通过反射操作属性:
直接这样操作private属性会报错,权限不够
在上面光标处关闭安全检测:
之后就能输出了;
-
性能对比分析
分析三种情况的性能对比:
反射执行:
关闭检测只用加一句语句即可
结果:
-
获取泛型信息
-
获取注解信息
ORM
创建测试类和注解:
加入注解:
反射操作注解:(可根据注解生成数据库语言,实现增删改查创建等操作)
-
本章小结