一、类加载区别
当我们刚接触java语言的时候,我们最常见的代码应该就是初始化某个对象,然后调用该对象的方法。
1、使用new创建对象,返回对象的引用。Student student = new Student();
2、调用方法:student.say();
当我们想在运行期才能指定具体对象的类型或调用的某个方法、属性时,普遍的编码方式将无法实现需求。
反射可以在运行期指定具体对象的类型以及调用某个方法、属性。
1、通过类名加载类 Class personClass = Class.forName("com.harley.Person");
2、获取构造器 Constructor constructor = personClass.getConstructor();
3、使用构造器获取实例对象 Person person = (Person) constructor.newInstance();
二、JVM类加载流程和内存结构
Step1:类编译器将java源文件
.java
编译为class文件.class
Step2:类加载器ClassLoader对class文件加载(加载、验证、准备、解析、初始化)到JVM
Step3:内存中分为JVM内存管理、本地内存
Step4:JVM内存管理分为
- 线程私有
- 程序计数器
- 本地方法栈:管理native方法的执行
- 虚拟机栈:栈帧(局部变量表、操作数栈、动态链接、方法出口)
Student student
- 线程公有
- 方法区:类信息、常量、静态变量、即时编译器编译后的代码
- java堆:Student实例对象
Step5:JVM垃圾回收线程公有以及本地内存到老年代。
Step6:堆内存=Eden内存 + S0/S1内存 + 老年代内存
三、Class文件包含的内容
Class文件中,几乎包含了所有类相关的信息,如:类名、包名、属性、方法等等。
四、创建实例对象的步骤对比
获得对象实例无论是使用new对象的方式,还是使用反射的方式,大致都是需要以下3步,即:
1、加载Class文件
2、查找入参匹配的构造函数
3、通过构造函数创建实例对象
五、反射相关的操作
- 通过无参构造函数创建实例对象
- 通过有参构造函数创建实例对象
- 反射通过私有构造函数创建对象,破坏单例模式
- 通过反射获得类的public属性值,演示getField与getDeclaredField两者的区别
- 通过反射获得类的private、protected、默认访问修饰符的属性值
- 通过反射获得类的private方法
- 我们采用反射机制来实现一个工具BeanUtils,可以将一个对象属性相同的值赋值给另一个对象。
- 通过mapstruct实现两个实体间的属性值复制
— 要养成终生学习的习惯 —
标签:反射,Java,进阶,对象,实例,内存,构造函数,加载 From: https://www.cnblogs.com/houhuilinblogs/p/18088061