- 框架
:半成品软件。可以在框架的基础上进行软件开发,简化代码。
- 概念
:将类的各个组成部分封装为其他对象,这就是反射机制。
java代码在计算机中经历的三个阶段:
javac编译,成为Source源代码阶段,此时还没有进内存,还是在硬盘上,此时生成的.class是字节码文件。new对象时候是第三个阶段,是Runtime运行时阶段。那么第二个阶段呢,字节码文件要是能变成对象,对象在内存里,就是说要把字节码文件加载进内存之后才能有个对象,所以第二个阶段是把字节码文件加载进内存,使用类加载器ClassLoader。内存里要来表示这个字节码文件,在内存里会有一个对象来描述字节码文件,java里有个类是Class类,用来描述所有字节码文件共同特征。都有成员变量,成员方法,构造方法等等。成员变量封装成Field[] fields,构造方法:Constructor[] cons,成员方法Method[] methods。将来通过类对象行为可以来创建真正的对象。第二个阶段就叫Class类对象阶段。
好处:
- 可以在程序运行过程中去操作这些对象。类似于idea在运行过程中可以知道对象的方法(自动补全方法)。
- 可以解耦,降低程序耦合性,提高程序的可扩展性。
获取Class对象的方式:
-
Class.forName(“全类名”);(第一阶段,未加载进内存时可使用)
多用于配置文件,将类名可以定在配置文件中,读取文件,加载类。*
-
类名.class:通过类名的属性class来获取(加载进内存,但是没有对象)
多用于参数传递
-
对象.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.获取类名
- 用get是因为成员变量在对象中,所以需要传递对象
- 想要输出还需重写tostring
- 用反射访问私有成员变量
- 需要忽略访问权限修饰符的安全检查,d.setAccessible(true);
即可。
- 下面是两种方法都可以创建对象,第二种是操作简化。
案例:可以创建任意类的对象,可以执行任意方法。
前提:不能改变类的任何代码。可以创建任意类的对象,可以执行任意方法。
- 只需要更改配置文件。在.properties文件中中添加
配置文件中选择的是Person类中的eat方法
- 这个类名就是ReflectTest,要获取他的字节码文件就要.class,再获得字节码文件的类加载器,将它加载进内存。类加载可以获得目录下的类和配置文件。
- 改代码需要测试等等,改配置文件不用测试