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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

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

    什么是动态代理?

    动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作(也可以对原方法的参数进行操作)。

    代理类在程序运行期间,创建的代理对象称之为动态代理对象。这种情况下,创建的代理对象,并不是事先在Java代码中定义好的。而是在运行期间,根据我们在动态代理对象中的“指示”,动态生成的。也就是说,你想获取哪个对象的代理,动态代理就会为你动态的生成这个对象的代理对象。动态代理可以对被代理对象的方法进行功能增强。有了动态代理的技术,那么就可以在不修改方法源码的情况下,增强被代理对象的方法的功能,在方法执行前后做任何你想做的事情。

    特点:字节码随用随创建,随用随加载

    作用:不修改源码的基础上对方法增强

    动态代理的常用两种方式:

    1.基于接口的动态代理

    提供者:JDK

    使用JDK官方的Proxy类创建代理对象

    注意:代理的目标对象必须实现接口(至少一个)

    2.基于类的动态代理

    提供者:第三方 CGLib

    使用CGLib的Enhancer类创建代理对象

    注意:被代理类不能用 final 修饰的类(最终类)。如果报 asmxxxx 异常,需要导入 asm.jar包

    //JDK动态代理(基于接口的动态代理)Proxy.newProxyInstance(三个参数);ClassLoader:类加载器它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。(固定写法)Class[]:字节码数组它是用于让代理对象和被代理对象有相同方法。(固定写法)InvocationHandler:用于提供增强的代码它是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须InvocationHandler该接口的实现类是谁用谁写,此时我们用就需要我们自己写

    此处以一个演员的例子为例:

    在很久以前,演员和剧组都是直接见面联系的。没有中间人环节。

    而随着时间的推移,产生了一个新兴职业:经纪人(中间人),这个时候剧组再想找演员就需要通过经纪人来找了。下面我们就用代码演示出来。

    package com.haust.service;public interface IActor {public void basicAct(float money);public void dangerAct(float money);}
    package com.haust.serviceImpl;import com.haust.service.IActor;public class Actor implements IActor {//实现了接口,就表示具有接口中的方法实现。即:符合经纪公司的要求@Overridepublic void basicAct(float money) {System.out.println("拿到钱,开始基本的表演:"+money);}@Overridepublic void dangerAct(float money) {System.out.println("拿到钱,开始危险的表演:"+money);}}
    package com.haust.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.haust.service.IActor;import com.haust.serviceImpl.Actor;public class Client {public static void main(String[] args) {//一个剧组找演员:final Actor actor = new Actor();//被代理的类//(IActor)Proxy.newProxyInstance,这里强制转换必须是接口类型IActor proxyActor = (IActor)Proxy.newProxyInstance(actor.getClass().getClassLoader(), actor.getClass().getInterfaces(), new InvocationHandler() { @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String name = method.getName();Float money = (Float) args[0];//执行的方法只有一个参数Object rtValue = null;//每个经纪公司对不同演出收费不一样,此处开始判断if("basicAct".equals(name)){//基本演出,没有 2000 不演if(money > 2000){//看上去剧组是给了 8000,实际到演员手里只有 4000//这就是我们没有修改原来 basicAct 方法源码,对方法进行了增强rtValue = method.invoke(actor, money/2);} }if("dangerAct".equals(name)){//危险演出,没有 5000 不演if(money > 5000){//看上去剧组是给了 50000,实际到演员手里只有 25000//这就是我们没有修改原来 dangerAct 方法源码,对方法进行了增强rtValue = method.invoke(actor, money/2);} }return rtValue;}});//没有经纪公司的时候,直接找演员。// actor.basicAct(1000f);// actor.dangerAct(5000f);//剧组无法直接联系演员,而是由经纪公司找的演员proxyActor.basicAct(2000f);//价格低于2000不演proxyActor.dangerAct(50000f);}}

    总结:

    首先需要创建一个interface然后一个class实现这个interface,然后对这个class进行代理,这个class必须实现至少一个接口

    基于子类的动态代理

    设计的类:Enhancer提供者:第三方cglib库如何创建代理对象:使用Enhancer类中的create方法创建代理对象的要求:被代理对象不是最终类(最终类没有子类)create方法的参数:Class方法的参数:Class:字节码它是用于指定被代理对象的字节码callback:用于提供增强的代码它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。此接口的实现类都是谁用谁写。我们一般写的都是该接口的子接口实现类:MethodInterceptor//CGLib动态代理(基于子类的动态代理)Enhancer.create(两个参数);

    代码如下:

    package com.haust.serviceImpl;public class Actor{//没有实现任何接口public void basicAct(float money) {System.out.println("拿到钱,开始基本的表演:"+money);}public void dangerAct(float money) {System.out.println("拿到钱,开始危险的表演:"+money);}}
    package com.haust.test;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import com.haust.serviceImpl.Actor;public class test {public static void main(String[] args) { Actor actor = new Actor();//需要创建此被代理的对象  //此时强转的类的类型就是被代理类的类型 Actor cglibActor = (Actor)Enhancer.create(actor.getClass(),new MethodInterceptor() {@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy  methodProxy) throws Throwable {String name = method.getName();Float money = (Float) args[0];Object rtValue = null;if("basicAct".equals(name)){//基本演出if(money > 2000){rtValue = method.invoke(actor, money/2);} }if("dangerAct".equals(name)){//危险演出if(money > 5000){rtValue = method.invoke(actor, money/2);} }return rtValue;}}); cglibActor.basicAct(10000); cglibActor.dangerAct(100000);}}

    “Java动态代理常用方式有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    免责声明:

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

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

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

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

    下载Word文档

    猜你喜欢

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

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

    Java动态代理的方式有哪些

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

    Java实现动态代理的方法有哪些

    这篇文章将为大家详细讲解有关Java实现动态代理的方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。详解Java动态代理的实现及应用Java动态代理其实写日常业务代码是不常用的,但在框
    2023-05-31

    java动态代理使用的场景有哪些

    Java动态代理可以被广泛地应用于以下场景:1. AOP(面向切面编程):动态代理可以在调用方法前后添加额外的逻辑,例如日志记录、性能监控等。AOP框架如Spring使用动态代理实现了事务管理、安全检查等横切关注点。2. 事务管理:动态代理
    2023-09-04

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

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

    Vue动态绑定Class的常用方式有哪些

    本篇内容主要讲解“Vue动态绑定Class的常用方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue动态绑定Class的常用方式有哪些”吧!第一种:基础用法Html部分:
    2023-07-05

    java代理的方式有哪些

    Java代理有以下几种方式:静态代理:在代理类中直接引用被代理类的对象,通过代理类对被代理类的方法进行调用和控制。动态代理:通过Java的反射机制,在运行时动态生成代理类,代理类实现了被代理类的接口,并在方法中调用被代理类的方法。CGLIB
    java代理的方式有哪些
    2024-03-07

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

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

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

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

    Java异常的处理方式有哪些

    这篇文章主要介绍“Java异常的处理方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java异常的处理方式有哪些”文章能帮助大家解决问题。什么是异常?异常在我们写代码是特别常见,因为程序员大
    2023-06-30

    使用动态ip代理有哪些好处

    这篇文章将为大家详细讲解有关使用动态ip代理有哪些好处,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态性与静态性是两个完全不同的概念,动态性IP不能直接上网,而动态性IP则是当你上网时,电信业随机地给你
    2023-06-25

    常用的java重构方式有哪些

    常用的Java重构方式包括:1. 提取方法(Extract Method):将一段代码逻辑提取为一个独立的方法,提高代码的可读性和可维护性。2. 内联方法(Inline Method):将一个方法的代码直接替换到调用方法的地方,减少不必要的
    2023-10-19

    Java实现AOP代理的方式有哪些

    这篇文章主要介绍了Java实现AOP代理的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java实现AOP代理的方式有哪些文章都会有所收获,下面我们一起来看看吧。AOP是一种设计思想,是软件设计领域中
    2023-07-02

    java中有哪些代理模式

    java中有哪些代理模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象
    2023-06-14

    java多态的实现方式有哪些

    Java中多态的实现方式有以下几种:1. 继承:子类继承父类,并重写父类的方法,通过父类引用指向子类对象实现多态。2. 接口:定义一个接口,多个类实现该接口,并重写接口中的方法,通过接口引用指向实现类对象实现多态。3. 方法重载:在同一个类
    2023-08-16

    JAVA静态载入的方式有哪些

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

    常见的HashMap迭代方式有哪些

    这篇文章主要介绍了常见的HashMap迭代方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇常见的HashMap迭代方式有哪些文章都会有所收获,下面我们一起来看看吧。一、 HashMap介绍HashMap
    2023-06-27

    编程热搜

    • 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动态编译

    目录