AOP的底层原理:动态代理

使用动态代理时会生成一个动态代理类

动态代理类是在程序运行期间由jvm通过反射等机制动态生成的。

所以不存在代理类的字节码文件(因为没有经历编译阶段),代理对象和真实对象的关系是在程序运行期间才确定的。

JDK动态代理

JDK的代理方式 只能针对接口,目标必须实现接口,同时代理类也实现了和目标对象同样的接口

package ThreadPoolLearn;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JdkProxyDemo {interface Foo{void foo();}static class Target implements Foo{@Overridepublic void foo() {System.out.println("target foo");}}//JDK的代理方式 只能针对接口,目标必须实现接口,同时代理类也实现了和目标对象同样的接口//目标类可以是finalpublic static void main(String[] args) {//目标类对象Target target=new Target();ClassLoader loader=JdkProxyDemo.class.getClassLoader();//动态代理类是在程序运行期间由jvm通过反射等机制动态生成的,//所以不存在代理类的字节码文件(因为没有经历编译阶段),代理对象和真实对象的关系是在程序运行期间才确定的。//下面的方法最终会返回实现接口的代理对象Foo proxy=(Foo) Proxy.newProxyInstance(loader/*类加载器,用来加载运行期间生成的字节码*/, new Class[]{Foo.class}/*要实现的接口*/,new InvocationHandler()/*用于执行代理类增强的方法*/ {@Overridepublic Object invoke(Object proxy/*代理对象自己*/, Method method/*正在执行的方法对象*/, Object[] args/*方法中的实际参数*/) throws Throwable {System.out.println("before");//将代理类和要增强的类结合起来Object result=method.invoke(target,args);return result;//让代理类放回目标方法执行的结果}});proxy.foo();}
}

Cglib动态代理

​ 通过Enhancer创建代理对象
​ 创建的代理对象是被代理对象的子类形
​ 因此目标类不能用final修饰
​ 目标方法也不能用final修饰,代理类代理该方法是重写方法

​ 能通过methodProxy,避免反射调用目标,可以提高效率
​ Object result2=methodProxy.invoke(target,args);

package ThreadPoolLearn;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibProxyDemo {static class Target{public void foo(){System.out.println("target foo");}}public static void main(String[] args) {Target target=new Target();//通过Enhancer创建代理对象//创建的代理对象时被代理对象的子类形//因此目标类不能用final修饰//目标方法也不能用final修饰,代理类代理该方法是重写方法Target proxy=(Target) Enhancer.create(Target.class/*目标类*/, new MethodInterceptor()/*用于执行代理类增强的方法*/ {@Overridepublic Object intercept(Object p/*代表代理类自己*/, Method method/*代理类中执行的方法*/, Object[] args/*方法执行时的实际参数*/,MethodProxy methodProxy) throws Throwable {System.out.println("before ");Object result=method.invoke(target,args);//使用方法反射调用目标//methodProxy,避免反射调用目标Object result2=methodProxy.invoke(target,args);//避免反射调用目标,使用代理对象自己Object result3=methodProxy.invokeSuper(p,args);System.out.println("after ");return null;}});proxy.foo();}
}

AOP的底层原理:动态代理相关推荐

  1. Spring 容器AOP的实现原理——动态代理

    本文来自极客学院 Spring 容器AOP的实现原理--动态代理 之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大 ...

  2. 菜鸟学SSH——Spring容器AOP的实现原理——动态代理

    之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  3. 【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象

    AOP编程 AOP 编程 AOP 概念 AOP 编程的开发步骤 切面的名词解释 AOP 的底层实现原理 动态代理类的创建 JDK 的动态代理(原理 + 编码) CGlib 的动态代理 Spring 工 ...

  4. spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  5. 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象

    一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...

  6. aop实现原理-动态代理CGLib代理

    那接下来的话,那咱们Spring当中,这个AOP,咱们先说概念,咱们先不写具体代码,咱们就是聊,聊Spring的AOP,Spring能帮我们干啥呢,我告诉你,Spring他作为对象的容器,Spring ...

  7. mybatis接口中的方法重载_MyBatis底层实现原理: 动态代理的运用

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:祖大俊 my.oschina.net/zudajun/blog/666223 一日小 ...

  8. AOP的实现原理 —— 静态代理 和 动态代理( Spring AOP)

    文章目录 一.AOP是什么? 二.静态代理 -- AspectJ 2.1.举例说明 三. 动态代理 3.1.JDK 动态代理 3.1.1. 核心类: 3.1.2. 示例1--JDK动态代理 3.2.C ...

  9. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

最新文章

  1. SAP MM初阶之包含有Service item的服务采购订单
  2. .so文件反编译_java加密防止反编译-VirboxProtector
  3. Bootstrap 进度条
  4. Vc6.0 调试指南 --Happy Debugging
  5. 自动挡跑高速用S挡还是D挡? 回答
  6. 《剑指offer》面试题5———从尾到头打印链表(C++ 实现)
  7. 拓端tecdat|R语言使用Profviz进行Metropolis-in-Gibbs抽样和运行时间分析
  8. 尚硅谷-Spring Cloud
  9. 分布式系统容错性方案设计:重试与幂等
  10. GMM 简介与 Stata 实现
  11. 推荐一款linux下流程图绘制工具-yEd Graph Editor
  12. 计算机网络体系批判,基于批判性思维的计算机网络概论课程改革.pdf
  13. 字符串的输入输出及字符串函数
  14. 人工神经网络图像识别,神经网络如何识别图像
  15. Vue开发项目入门——Vue脚手架
  16. BZOJ 2121: 字符串游戏
  17. 使用UIImagePickerController实现 iOS录像拍照
  18. Windows进程通信之PE文件共享节
  19. OceanBase 3.1.2版本测试报告
  20. prousb注册计算器的使用方法

热门文章

  1. 华硕P4P800-VM声卡驱动问题
  2. 江门分销官网开发日记:wordpress检测后端标题并且避免重复标题
  3. LoRaWAN网关如何工作?集中器、运行程序、服务器缺一不可
  4. 超实用!移动端界面中的版式设计原理(上)
  5. PaddlePaddle 系列之三行代码从入门到精通
  6. 使用移远BC28模块遇到的问题
  7. 霍尼韦尔为蝙蝠飞机旗下货运无人机提供关键导航和传感器技术
  8. 图片怎样优化的8个小技巧
  9. 用C语言编辑得到的利息,【c语言】计算存款利息
  10. 想学Java开发,有什么方式可以选择?