广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实例讲解动态代理
  • 319
分享到

Java实例讲解动态代理

2024-04-02 19:04:59 319人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

jdk动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节

jdk动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

强制使用CGlib

<!-- proxy-target-class="false"默认使用JDK动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<aop-config proxy-target-class="true">

具体代码示例:


public interface UserManager {    
    public void addUser(String id, String passWord);    
    public void delUser(String id);    
}

public class UserManagerImpl implements UserManager {    
    @Override
    public void addUser(String id, String password) {    
        System.out.println("调用了UserManagerImpl.addUser()方法!");
    }    
    @Override
    public void delUser(String id) {    
        System.out.println("调用了UserManagerImpl.delUser()方法!");
    }    
}

public class JDKProxy implements InvocationHandler {    
    // 需要代理的目标对象
    private Object targetObject;    
    public Object newProxy(Object targetObject) {
        // 将目标对象传入进行代理    
        this.targetObject = targetObject;
        // 返回代理对象 
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
    }    
    // invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 进行逻辑处理的函数
        checkPopedom();
        Object ret = null;
        // 调用invoke方法
        ret = method.invoke(targetObject, args);
        return ret;
    }    
    private void checkPopedom() {
        // 模拟检查权限   
        System.out.println("检查权限:checkPopedom()!");    
    }    
} 

 public class CGLibProxy implements MethodInterceptor {    
    // CGlib需要代理的目标对象
    private Object targetObject;
    public Object createProxyObject(Object obj) {
        this.targetObject = obj;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(this);
        Object proxyObj = enhancer.create();
        return proxyObj;
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object obj = null;
        // 过滤方法
        if ("addUser".equals(method.getName())) {
            // 检查权限
            checkPopedom();
        }
        obj = method.invoke(targetObject, args);
        return obj;
    }    
    private void checkPopedom() {
        System.out.println("检查权限:checkPopedom()!");
    }
}

public class ProxyTest {
    public static void main(String[] args) {
        UserManager userManager = (UserManager)new CGLibProxy().createProxyObject(new UserManagerImpl());
        System.out.println("CGLibProxy:");
        userManager.addUser("tom", "root");
        System.out.println("JDKProxy:");
        JDKProxy jdkProxy = new JDKProxy();
        UserManager userManagerJDK = (UserManager)jdkProxy.newProxy(new UserManagerImpl());
        userManagerJDK.addUser("tom", "root");
    }
}

// 运行结果
CGLibProxy:
检查权限checkPopedom()!
调用了UserManagerImpl.addUser()方法!
JDKProxy:
检查权限checkPopedom()!
掉用了UserManagerImpl.addUser()方法!

总结

  • JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;
  • JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。

到此这篇关于Java实例讲解动态代理的文章就介绍到这了,更多相关Java动态代理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实例讲解动态代理

本文链接: https://www.lsjlt.com/news/150499.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实例讲解动态代理
    JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节...
    99+
    2022-11-13
  • Java静态代理和动态代理的深入讲解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对...
    99+
    2022-11-12
  • java 动态生成SQL的实例讲解
    代码如下: public <T> String updateSqlAndParamList(Vector<String> ve,List<String> paramList,T t,String tabl...
    99+
    2023-05-31
    java 动态生成 sql
  • Java静态代理与动态代理案例详解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象...
    99+
    2022-11-12
  • Java动态代理机制的实例详解
     Java动态代理机制在学习spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功...
    99+
    2023-05-31
    java 动态代理 ava
  • Java动态代理与静态代理实例分析
    这篇文章主要介绍了Java动态代理与静态代理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态代理与静态代理实例分析文章都会有所收获,下面我们一起来看看吧。一、静态代理静态代理的使用静态代理,代...
    99+
    2023-07-02
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2022-11-12
  • Java中JDK动态代理的超详细讲解
    目录1. 什么是动态代理?2.动态代理的实现方式有几种?3. JDK动态代理4. CGLB动态代理5.动态代理的效率6.为什么要使用动态代理呢?7. JDK动态代理详细使用介绍总结1...
    99+
    2022-11-13
    Java jdk动态代理 java动态代理原理 jdk动态代理是如何实现的
  • Java动态代理的示例详解
    目录定义分类案例需求方案一:jdk动态代理方案二:cglib动态代理分析总结定义 动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在...
    99+
    2022-11-13
  • Java实现动态代理的实例代码
    目录前言静态代理 动态代理 CGLib实现动态代理 总结前言 动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC...
    99+
    2022-11-12
  • Java动态规划之丑数问题实例讲解
    问题描述: 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 注: 1也是丑数 思路: 我们来分析一下丑数如何得到,肯...
    99+
    2022-11-13
  • Java 静态代理与动态代理解析
    目录一、代码实践静态代理动态代理二、常见的动态代理场景Retrofit中的动态代理使用动态代理实现 onClick注入三、源码探索 Jdk 中的动态代理生成代理类四、总结静态代理: ...
    99+
    2022-11-13
  • JAVA代理,静态,动态详解
    目录代理静态代理动态代理JDK动态代理CGLib动态代理总结代理 为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对...
    99+
    2022-11-12
  • Java动态代理示例分析
    这篇文章主要讲解了“Java动态代理示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java动态代理示例分析”吧!定义动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通...
    99+
    2023-06-29
  • jdk动态代理使用实例详解
    目录前言为什么需要代理java中常用的代理模式一、JDK 动态代理二、cglib静态代理三、spring中代理的使用总结前言 代理模式不管是JDK,spring框架,还是日常的开发中...
    99+
    2022-11-13
  • Java的动态代理和静态代理详解
    目录0、代理模式1、静态代理2、 加深理解3、动态代理动态代理的例子总结0、代理模式 为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】 代...
    99+
    2022-11-13
  • 深入理解Java动态代理与静态代理
    目录前言一、静态代理静态代理的使用与装饰者模式的区别二、动态代理JDK 动态代理CGlib 动态代理实现前言 学习 Spring 的过程中,不可避免要掌握代理模式。这篇文章总结一下代...
    99+
    2022-11-13
  • Java 普通代码块静态代码块执行顺序(实例讲解)
    如下所示:class B { public B() { super(); System.out.println("构造器B"); } { System.out.println("普通的代码块B"); } static{ System...
    99+
    2023-05-31
    静态代码块 执行顺序 java
  • Java中反射动态代理接口的详解及实例
    Java语言中反射动态代理接口的解释与演示Java在JDK1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下设计模式的UML图解:当你调用一个接口API时候,实际实现类继承该接口,...
    99+
    2023-05-31
    java 反射 动态代理
  • Java中动态代理和静态代理的示例分析
    这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作