反射
1、反射的概述
反射:将类的各个组成部分封装为其他对象,这就是反射机制。
反射的优点:
- 可以在程序运行的过程中,操作这些对象。
- 可以解耦,提高程序的可扩展性。
2、 获取Class对象的三种方式
java代码在计算机中经历的阶段:三个阶段
在获取去Class对象之前,我们首先要明白,java代码在计算机中所经历的三个阶段
Source 源代码阶段 :就是我们在idea中所写的Java代码阶段(.java结尾的文件)
Class类对象阶段:是我们通过javac 命令去编译的字节码文件阶段(.class结尾的文件)
Runtime运行时阶段:运行时,将class文件加载到内存中去运行的阶段
相对应的,我们就可以针对java代码的各个阶段去获取class对象
获取Class对象的三种不同方式在这里插入代码片
//方式一 通过 对象.getClass 来获取class对象 :getClass()方法在Object勒种定义着
Class c1 = teacher.getClass();
//方式二 通过 Class.forName(类的全路径名称) 来获取class对象:将字节码文件加载进内存
Class c2 = Class.forName("reflect.Teacher");
//方式三 通过 类名.class来获取class对象: 通过类名的属性class获取
Class c3 = Teacher.class;
- Class.forName(“全类名”):将字节码文件加载进内存,返回class对象。
所用于配置文件,将类名定义在配置文件中。读取文件,加载类 - 类名.class:通过类名的属性Class获取。
多用于参数的传递 - 对象.getClass(): getClass()方法在Object类中定义着。
多用于对象的获取字节码的方式
结论:同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个Class对象。
3、Class对象功能
获取Class对象的功能
-
获取成员变量们
Field[ ] getFields( )
Field getField(String name)Field[ ] getDeclareFields( )
Field getDeclareField(String name) -
获取构造方法们
Constructor<?>[ ] getConstructors( )
Constructor getConstructor<类<?>…parameterTypes>Constructor getDeclaredConstructor(类<?>…parameterTypes)
Constructor<?>[ ] getDeclaredConstructors( ) -
获取成员方法们
Method[ ] getMethods( )
Method getMethod(String name , 类<?>… parameterTypes )Method[ ] getDeclaredMethods( )
Method getDeclaredMethod(String name, 类<?>…parameterTypes) -
获取类名
String getName( )
获取class功能的具体使用
- 获取成员变量们
注意点:只能获取被public修饰的成员变量
Field[ ] getFields( )
Field getField(String name)
注意点 : 获取所有的成员变量(不考虑修饰符)
Field[ ] getDeclareFields( )
Field getDeclareField(String name)
Field:成员变量
操作:
1. 设置值
void set(Object obj ,Object value)
2. 获取值
get (Object obj)
3. 忽略访问权限修饰符的安全检查
setAccessible(true) 暴力反射
- 获取构造方法们
注意点 :获取构造方法就是要创建对象
Constructor<?>[ ] getConstructors( )
Constructor getConstructor<类<?>…parameterTypes>
Constructor:构造方法
创建对象:
T newInstance(Object… initargs)
如果使用空参构造方法创建对象,操作可以简化:Class对象的newInstance方法
- 获取成员方法们
注意点:只能获取被public修饰的成员方法
Method[ ] getMethods( )
Method getMethod(String name , 类<?>… parameterTypes )
注意点:获取所有的成员方法(不考虑修饰符)
Method[ ] getDeclaredMethods( )
Method getDeclaredMethod(String name, 类<?>…parameterTypes)
Constructor:构造方法
创建对象
Method:方法对象
执行方法:
Object invoke(Object obj,Object… args)
获取方法的名称
String getName