文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java JDK与cglib动态代理有哪些区别

2023-07-05 14:01

关注

本篇内容主要讲解“Java JDK与cglib动态代理有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java JDK与cglib动态代理有哪些区别”吧!

一、说明

spring aop中的动态代理主要有两种方式,jdk动态代理和cglib动态代理

从实现接口、继承父类的角度讨论区别

从限制角度讨论区别

从性能上讨论区别

二、区别

jdk动态代理只提供实现接口的目标类代理,不支持没有实现接口的目标类的代理。如果目标类没有实现接口,只能用cglib代理

jdk动态代理会在运行时为目标类生成一个动态代理类$proxy*.class。cglib的底层是通过ASM在运行时动态生成目标类的子类,还会有其它类

jdk动态代理的代理类实现了目标类实现的接口,并且会实现接口所有方法来代码增强。cglib动态代理会重写父类所有的方法来代码增强

jdk动态代理调用时先去调用处理类进行增强,再通过反射的方式调用目标类的方法。cglib动态代理调用时先通过代理类进行增强,再直接调用父类对应的方法进行调用目标方法

jdk动态代理如果目标类未实现接口则无法代理,cglib是通过继承的方式来动态代理,若目标类被final关键字修饰,则无法使用cglib做动态代理

性能上:在老版的jdk,jdk代理生成的类速度快,通过反射调用慢,cglib是jdk代理速度的10倍左右,jdk在版本每次升级都会有很大的性能提升,cglib停滞不前,jdk7 8的动态代理性能在1万次实验中比cglib要快20%左右

三、代码示例

3.1 静态代理

package com.proxy.staticproxy;public interface SellTicket {    void sell();}
package com.proxy.staticproxy;public class TrainStation implements SellTicket{     @Override     public void sell() {         System.out.println("火车站售票");     } }
package com.proxy.staticproxy;public class ProxyPoint implements SellTicket{    //声明火车类对象    private TrainStation trainStation = new TrainStation();    @Override    public void sell() {        System.out.println("代售点收取服务费");        trainStation.sell();    }    public static void main(String[] args) {        ProxyPoint proxyPoint = new ProxyPoint();        proxyPoint.sell();    }}

3.2 jdk动态代理

package com.proxy.jdkproxy;import com.proxy.staticproxy.SellTicket;import com.proxy.staticproxy.TrainStation;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyFactory {    private TrainStation trainStation = new TrainStation();    public SellTicket getProxyPoint() {                SellTicket sellTicket = (SellTicket)Proxy.newProxyInstance(trainStation.getClass().getClassLoader(), trainStation.getClass().getInterfaces(),                new InvocationHandler() {                                        @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                     // 代码增强                        System.out.println("代理点收取服务费");                        Object object = method.invoke(trainStation, args);                        return object;                    }                });        return sellTicket;    }    public static void main(String[] args) {        ProxyFactory proxyPoint = new ProxyFactory();        SellTicket sellTicket = proxyPoint.getProxyPoint();        sellTicket.sell();    }}

3.3 cglib动态代理

<!-- 引入cglib依赖包--><dependency>     <groupId>cglib</groupId>     <artifactId>cglib</artifactId>     <version>2.2.2</version> </dependency>
package com.cglib;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 ProxyFactory implements MethodInterceptor {    private TrainStation trainStation = new TrainStation();    public TrainStation getTrainStation(){        //创建Enhancer对象,类似于JDK代理中的Proxy类        Enhancer enhancer = new Enhancer();        //设置父类的字节码对象        enhancer.setSuperclass(TrainStation.class);        //设置回调函数        enhancer.setCallback(this);        //创建代理对象        TrainStation trainStation = (TrainStation)enhancer.create();        return trainStation;    }    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {    // 代码增强        System.out.println("代售点收取服务费用");        Object obj = method.invoke(trainStation, objects);        return obj;    }    public static void main(String[] args) throws Exception {        ProxyFactory proxyFactory = new ProxyFactory();        TrainStation trainStation = proxyFactory.getTrainStation();        trainStation.sell();    }}

到此,相信大家对“Java JDK与cglib动态代理有哪些区别”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯