我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇内容主要讲解“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

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

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

下载Word文档

猜你喜欢

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

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

JDK动态代理和CGLIB区别

JDK动态代理和CGLIB区别1、JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。(相关视频教程分享:java视频教程)2、CGLiB
JDK动态代理和CGLIB区别
2020-11-10

spring cglib 与 jdk 动态代理

1. 概述JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处
2023-05-31

JavaJDK与cglib动态代理有什么区别

这篇文章主要介绍了JavaJDK动态代理和cglib动态代理的区别文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-03-20

java动态代理(jdk与cglib)详细解析

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了
2022-11-15

基于jdk动态代理和cglib动态代理实现及区别说明

这篇文章主要介绍了基于jdk动态代理和cglib动态代理实现及区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-19

JAVA中静态代理与动态代理的区别有哪些

这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于j
2023-05-31

深入浅析java 中的JDK与cglib动态代理

这篇文章将为大家详细讲解有关深入浅析java 中的JDK与cglib动态代理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 动态代理实例详解1.jdk动态代理 p
2023-05-31

深入理解java动态代理的两种实现方式(JDK/Cglib)

什么是代理模式?代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。为什么要使用代理模式?通过代理模式可以实现对
2023-05-31

SOCKS5与http代理有哪些区别

今天小编给大家分享的是SOCKS5与http代理有哪些区别,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。不仅仅是因特网上的IP替换可以通过代理HTTP来替换IP转换器,加速也可以使用
2023-06-15

Java动态代理的方式有哪些

这篇文章主要介绍“Java动态代理的方式有哪些”,在日常操作中,相信很多人在Java动态代理的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态代理的方式有哪些”的疑惑有所帮助!接下来,请跟
2023-06-26

动态代理IP和静态代理IP有什么区别

动态代理IP和静态代理IP有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代理ip从ip的拨号方式来区分,分为动态ip和静态ip,所以代理ip也分为动态ip和静态i
2023-06-15

java中不同代理的区别有哪些

小编给大家分享一下java中不同代理的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,
2023-06-14

Java动态代理常用方式有哪些

本篇内容介绍了“Java动态代理常用方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是动态代理?动态代理就是,在程序运行期,创建
2023-06-25

java动态代理的优缺点有哪些

Java动态代理的优点包括:1. 减少重复编码:使用动态代理可以将一些通用的代码逻辑抽象出来,减少重复编写相似的代码。2. 提高代码的可维护性:通过动态代理,可以将一些与业务逻辑无关的代码(如日志记录、事务管理等)与业务逻辑分离,提高代码的
2023-08-08

java bean与ejb有哪些区别

这篇文章主要为大家展示了“java bean与ejb有哪些区别 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java bean与ejb有哪些区别 ”这篇文章吧。您现在可能已在使用 JavaBe
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录