一、反射的概念
1.定义:
将类的各个组成部分封装为其他对象,这就是反射机制。
2.Java代码在计算机中经历的阶段:
3.好处:
(1) 可以在程序运行的过程中,操作这些对象。
(2) 解耦,提供程序的可扩展性。
二、获取Class对象的方式
1. 获取方式:
Class.forName(“全类名”):
将字节码文件加载进内存,返回Class对象。多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
类名.class:
通过类名的class属性获取。多用于参数的传递。
对象.getClass: getClass()方法在Object中定义着。对象获取字节码的方式。
2.结论:
同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个。
三、Class对象功能
1.获取功能
Declare表示获取所有,没有Declare只能获取public修饰的。
对于 非public修饰的成员变量想要对其进行操作需要忽略访问权限修饰符的安全检查:
Field对象.setAccessible(true); //暴力反射
(1) 获取成员变量
获取:
- Field[ ] getFields()
- Field getField(String name)
- Field[ ] getDeclaredFields()
- Field getDeclaredField(String name)
常用操作:
- 获取值:Field对象.get(Object obj);
- 设置值:Field对象.set(Object obj,Object value);
(2) 获取构造方法
//类<?>… parameterTypes表示参数类型,如String.class
- Constructor<?>[ ] getConstructors()
- Constructor<?> getConstructor(类<?>… parameterTypes)
- Constructor<?>[ ] getDeclaredConstructors()
- Constructor<?> getDeclaredConstructor(类<?>… parameterTypes)
常用操作:
- 创建对象:Constructor对象.newInstance(Object… initargs);
参数为空表示创建无参对象,可以简化成Class对象.newInstance()
(3) 获取成员方法
获取:
- Method[ ] getMethods()
- Method getMethod(String name,类<?>… parameterTypes)
- Method[ ] getDeclaredMethods()
- Method getDeclaredMethod(String name,类<?>… parameterTypes)
常用操作:
- 执行方法:Method对象.invoke(Object obj,Object… args);
- 获取方法名称:Method对象.getName();
(4) 获取类名
- Class对象.getName()