Java进阶 - [1-4] 反射

 

 

一、类加载区别

当我们刚接触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、通过构造函数创建实例对象

 

五、反射相关的操作

  1. 通过无参构造函数创建实例对象
  2. 通过有参构造函数创建实例对象
  3. 反射通过私有构造函数创建对象,破坏单例模式
  4. 通过反射获得类的public属性值,演示getField与getDeclaredField两者的区别
  5. 通过反射获得类的private、protected、默认访问修饰符的属性值
  6. 通过反射获得类的private方法
  7. 我们采用反射机制来实现一个工具BeanUtils,可以将一个对象属性相同的值赋值给另一个对象。
  8. 通过mapstruct实现两个实体间的属性值复制

 

 

 

 

— 要养成终生学习的习惯 —

posted @ 2024-03-27 10:10  HOUHUILIN  阅读(3)  评论(0编辑  收藏  举报