反射
概念
对于任何一个Class类,在运行的时候都可以直接得到这个类的全部成分
- 构造器对象 Construtor
- 成员变量对象 field
- 成员方法对象 method
运行时动态获取信息以及动态调用类中成分的能力称为Java语言的反射机制
关键
获取编译后的Class类对象
1
2
HelloWorld.java -> javac -> HelloWorld.class;
Class c = HelloWorld.class;
获取方式
- 获取类对象
1
2
3
Class c1 = Class.forname("全类名");
Class c2 = 类名.class;
Class c3 = 对象.getClass();
- 获取构造器对象
1
2
getDeclaredConstructors();
getDeclaredConstructor(Class<?>... parameterTypes);
创建对象 public newInstance
非public的 需要打开权限 setAccessable(boolean)
即暴力反射 会破坏封装性
- 获取类成员变量对象
1
2
3
4
5
6
7
getDeclaredFields();
getDeclaredField (String name);
//
void set(Object obj, Object value);
Object get(Object obj);
// 非public
setAccessible(boolean);
- 获取类方法对象
1
2
3
4
5
6
getDeclaredMethods();
getDeclaredMethod (String name, Class<?>... parameterTypes);
//
Object invoke(Object obj, Object... args);
//
setAccessible(boolean);
作用举例
1. 破坏封装性
2. 破坏泛型的约束性
编译成class文件进入运行阶段的时候,泛型会自动擦除
反射是作用在运行时的技术,此时已经不存在泛型了
3. 做通用框架
给任意一个对象,在不清楚对象字段的情况可以把对象的字段名称和对应值存储到文件中去