咫尺天涯处,似假几若真。
Java Reflection
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以称之为:反射。
区别
反射的作用
- 得到一个对象所属的类,
- 获取一个类的所有成员变量和方法,
- 在运行时创建对象,调用对象的方法
反射机制的实现
- 通过类名获取 类名.calss
- 通过对象获取 对象.getClass
- 通过全类名获取 Class.forName(“类路径.类名”)
1 | public class Fanshe { |
反射的具体应用
- 原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。关于这一点的实例有:简单工厂模式的优化、Spring框架中Bean的创建、动态代理的实现等。
- 原来并未使用反射时,我们没办法在运行时动态获取/修改一个类的所有属性,而通过反射机制,我们能够在运行时确定类的状态和属性,这为灵活操作提供了空间。具体的实例有:运行时根据类的状态进行异常监测,突破封装限制获取修改private、protected属性,这点在IDE的调试器中就有应用。
反射机制常用的类:
1 | Java.lang.Class; |
反射越过泛型检查
- 泛型是在编译期间起作用的。在编译后的.class文件中是没有泛型的。所有比如T或者E类型,本质都是通过Object处理的。所以可以通过使用反射来越过泛型。
1 | package test; |