反射:框架设计的灵魂(初步学习)

- 框架

:半成品软件。可以在框架的基础上进行软件开发,简化代码。

- 概念

:将类的各个组成部分封装为其他对象,这就是反射机制。

java代码在计算机中经历的三个阶段:

javac编译,成为Source源代码阶段,此时还没有进内存,还是在硬盘上,此时生成的.class是字节码文件。new对象时候是第三个阶段,是Runtime运行时阶段。那么第二个阶段呢,字节码文件要是能变成对象,对象在内存里,就是说要把字节码文件加载进内存之后才能有个对象,所以第二个阶段是把字节码文件加载进内存,使用类加载器ClassLoader。内存里要来表示这个字节码文件,在内存里会有一个对象来描述字节码文件,java里有个类是Class类,用来描述所有字节码文件共同特征。都有成员变量,成员方法,构造方法等等。成员变量封装成Field[] fields,构造方法:Constructor[] cons,成员方法Method[] methods。将来通过类对象行为可以来创建真正的对象。第二个阶段就叫Class类对象阶段。
好处:

  1. 可以在程序运行过程中去操作这些对象。类似于idea在运行过程中可以知道对象的方法(自动补全方法)。
  2. 可以解耦,降低程序耦合性,提高程序的可扩展性。

获取Class对象的方式:

  1. Class.forName(“全类名”);(第一阶段,未加载进内存时可使用)

    多用于配置文件,将类名可以定在配置文件中,读取文件,加载类。*

  2. 类名.class:通过类名的属性class来获取(加载进内存,但是没有对象)

    多用于参数传递

  3. 对象.getClass(),封装在object类中的,所有对象都可用。

    多用于对象的获取字节码的方式

同一个字节码问就按在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
!](https://img-blog.csdnimg.cn/20210130162355996.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZiYmJiYmJiYmJiYg==,size_16,color_FFFFFF,t_70)

Class对象功能(常见):
*获取功能:
1.获取成员变量们
2.获取构造方法们
3.获取成员方法们
4.获取类名
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Vbbb

  • 用get是因为成员变量在对象中,所以需要传递对象

Vbbb

  • 想要输出还需重写tostring

在这里插入图片描述

  • 用反射访问私有成员变量
    在这里插入图片描述
  • 需要忽略访问权限修饰符的安全检查,d.setAccessible(true);
    在这里插入图片描述
    即可。

在这里插入图片描述

在这里插入图片描述

  • 下面是两种方法都可以创建对象,第二种是操作简化。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

案例:可以创建任意类的对象,可以执行任意方法。

前提:不能改变类的任何代码。可以创建任意类的对象,可以执行任意方法。
在这里插入图片描述

  • 只需要更改配置文件。在.properties文件中中添加

在这里插入图片描述
配置文件中选择的是Person类中的eat方法

在这里插入图片描述

  • 这个类名就是ReflectTest,要获取他的字节码文件就要.class,再获得字节码文件的类加载器,将它加载进内存。类加载可以获得目录下的类和配置文件。
    在这里插入图片描述
    在这里插入图片描述
  • 改代码需要测试等等,改配置文件不用测试

猜你喜欢

转载自blog.csdn.net/vbbbbbbbbbbb/article/details/113417261