反射与动态代理原理

反射与动态代理原理



1 关于反射
反射最大的作用之一就在于我们可以 不在编译 时知道某个对象的类型,而在 运行时 通过 提供完整的”包名+类名.class”得到 。注意:不是在编译时,而是在运行时。

功能:
•在运行时能 判断 任意一个 对象所属的类
•在运行时能 构造 任意一个类的对象。
•在运行时 判断 任意一个类所具有的 成员变量和方法
•在运行时 调用 任意一个对象的方法。
说大白话就是,利用Java反射机制我们可以 加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。

应用场景:
反射技术常用在各类 通用框架开发 中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。

特点:
由于反射会额外消耗一定的系统资源,因此如果 不需要动态地创建一个对象 ,那么就不需要用反射。另外,反射调用方法时可以 忽略权限检查 ,因此可能会 破坏封装性而导致安全问 题。

2 动态代理
为其他对象提供一种代理 以控制对这个对象的访问 。在某些情况下,一个 对象不适合或者不能直接引用另一个对象 ,而 代理对象可以在两者之间起到中介的作用 (可类比房屋中介,房东委托中介销售房屋、签订合同等)。
所谓动态代理,就是实 现阶段不用关心代理谁 ,而是在 运行阶段才指定代理哪个一个对象 (不确定性)。如果是自己 写代理类的方式就是静态代理(确定性)。

组成要素:
(动态)代理模式主要涉及三个要素:
其一: 抽象类接口
其二: 被代理类 (具体实现抽象接口的类)
其三: 动态代理类 :实际调用被代理类的方法和属性的类

实现方式:
实现动态代理的方式很多,比如 JDK 自身提供的动态代理 ,就是主要利用了反射机制。还有其他的实现方式,比如利用字节码操作机制,类似 ASM、CGLIB(基于 ASM)、Javassist 等。

举例,常可采用的JDK提供的动态代理接口InvocationHandler来实现动态代理类。其中invoke方法是该接口定义必须实现的,它完成对真实方法的调用。通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。此外,我们常可以在invoke方法实现中增加自定义的逻辑实现,实现对被代理类的业务逻辑无侵入。

  静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。
   动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间
  JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。新版本也开始结合ASM机制。
   cglib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类
Java 发射机制的常见应用:动态代理(AOP、RPC)、提供第三方开发者扩展能力(Servlet容器,JDBC连接)、第三方组件创建对象(DI)……




猜你喜欢

转载自blog.csdn.net/weixin_37766296/article/details/80444675