动态代理的原理以及反射机制
2018-06-14 本文已影响26人
biginsect
动态代理
代理:在某些情况下,一个对象不适合或者无法直接调用另一个对象,而代理对象可以在这两者之间起到中介的作用。也就是为其他对象提供一种代理来控制对某个对象的访问。
代理模式组成元素:1. 抽象类接口 2.被代理类(实现了抽象接口的类) 3.代理类(实际调用被代理类的方法和属性的类)
动态代理是一种方便运行时构建代理、动态处理代理方法调用的一种机制,即实现阶段不用关心代理谁,而是在运行阶段才指定代理的对象(不确定性),如果是自己写代理类就是静态代理(确定性)。
有很多场景是运用动态代理实现的,如 Spring AOP(面向切面编程)以及 RPC (Remote Procedure Call,远程过程调用——一种网络技术协议)。在编程中实现动态代理的方式有很多,在 JDK 提供的动态代理,主要是利用了反射机制。
反射机制
反射是 Java 提供的一种基础功能,它是指在运行时对任意一个类能够知道整个类的所有属性和方法,并且能够调用它的任意属性和方法(需要提供完整的 “包名+类名.class” )。
功能:
- 在运行时能够判断任意一个对象所属的类
- 在运行时构建任意一个类的对象
- 在运行时获取任意一个类的所有的成员变量和方法
- 在运行时调用任意一个对象的方法和属性
通过反射机制我们可以直接操作类或者对象,甚至对其定义进行修改。注意到 Java 反射提供的 AccessibleObject 类下的 setAccessible() 方法 可以修改类成员的访问限制,(如 private 改成 public)。
Tips:
反射会额外消耗一定的系统资源,若非必要,尽量少用反射。另外反射调用方法时可以忽略权限检查,可能引起安全问题。