反射
1. 概述
反射是框架设计的灵魂,反射最大程度破坏了面向对象的封装特性
正常方式:引入需要的“包类”名称
→ 通过new实例化
→ 取得实例化对象
反射方式:实例化对象
→ getClass()方法
→ 得到完整的“包类”名称
反射的优缺点:
- 优点:可以实现动态创建对象和编译
- 缺点:对性能有影响,执行速度相对于正常方式较慢
2. Class类
2.1 获取Class实例
//方法一:通过对象获得
Class c1 = person.getClass();
//方法二:通过forName获得
Class c2 = Class.forName("com.falsche.reflection.Student");
//方法三:通过类名.class获得
Class c3 = Student.class;
//获得父类类型,getSuperclass()
Class c4 = c1.getSuperclass();
2.2 Class对象功能
- 获取成员变量
getField(String name); //获取指定public变量
getFields(); //获取public变量
getDeclaredField(String name); //获取指定变量(public, private)
getDeclaredFields(); //获取所有变量
Field
:成员变量
- 设置值
void set(Object obj, Object value)
- 获取值
get(Object obj)
- 忽略访问权限修饰符的安全检查
setAccessible(true); //暴力反射
- 获取构造方法
getConstructor(); //获取指定public构造方法
getConstructors(); //获取public构造方法
getDeclaredConstructor(); //获取指定构造方法(public, private)
getDeclaredConstructors(); //获取所有构造方法
Constructor
:构造方法
创建对象:
- 有参构造方法
Constructor constructor = userClass.getConstructor(int.class, String.class);
constructor.newInstance(1, "acdc");
- 有参构造方法
-
无参构造方法
userClass.newInstance();
- 获取成员方法
getMethod(); //获取指定名称的public方法
getMethods(); //获取public方法(包含父类)
getDeclaredMethod(); //获取指定名称的方法(public, private)
getDeclaredMethods(); //获取本类的所有方法
Method
:成员方法
- 执行方法:method.invoke()
公有构造方法时:Method method = userClass.getMethod("toString");
User user = new User();
Object user = userClass.newInstance();
method.invoke(user); //执行方法
私有构造方法时:
Constructor c = userClass.getDeclaredConstructor();
c.setAccessible(true);
Object user = c.newInstance();
Method method = userClass.getDeclaredMethod("toString");
method.invoke(user); //执行方法
- 获取方法名称:
getName()
- 获取类名
getName()