Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java中的动态代理

Java中的动态代理

作者头像
关忆北.
发布于 2021-12-07 08:40:22
发布于 2021-12-07 08:40:22
49900
代码可运行
举报
文章被收录于专栏:关忆北.关忆北.
运行总次数:0
代码可运行

Java中的动态代理

实现动态代理方式

Java中的代理方式主要分为两种,一种是基于接口的动态代理,另一种是基于类的动态代理,而基于接口的动态代理有JDK Proxy,基于类的动态代理主要有ASM、cglib,本文主要讲述的是JDK Proxy实现动态代理。

JDK动态代理实现

JDK动态代理基于拦截器和反射实现,使用JDK代理时需要传入被代理类的class。

JDK代理的步骤
  • 创建接口类,并实现接口
  • 自定义Handler去实现JDK的InvocationHandler接口
  • 在invoke方法中写入自定义逻辑,以扩展原有逻辑
  • 使用Proxy创建代理对象
  • 使用代理对象调用原对象的方法
talk is cheap,show me your code.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
 * @author Liutx
 * @date 2021/3/6 10:57
 * @Description 使用JDK的动态代理方式
 */

public class MyDynamicProxy {
    public static void main(String[] args) {
        HelloImpl hello = new HelloImpl();
        MyInvocationHandler handler = new MyInvocationHandler(hello);
        // 构造代码实例
        Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler);
        // 调用代理方法
        proxyHello.sayHello();
    }
}

interface Hello {
    void sayHello();
}

class HelloImpl implements Hello {
    @Override
    public void sayHello() {
        //原方法逻辑
        System.out.println("Hello World");
    }
}

/**
 * 使用JDK Proxy代理为应用插入额外的逻辑
 */
class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("------插入前置通知代码-------------");
        // 执行相应的目标方法
        Object rs = method.invoke(target, args);
        System.out.println("------插入后置处理代码-------------");
        return rs;
    }
}
JDK Proxy存在的缺陷

JDK 动态代理是基于接口实现的代理操作,如果该类没有需要实现的接口则无法使用JDK代理,由于JDK的动态代理无需引入第三方的包,所以,在个人看来这既是JDK动态代理的优势又是其短板,在我们企业级开发常用的Spring框架中,经常使用到的Spring AOP技术使用了两种代理模式:JDK代理和cglib动态代理。

引用一下以下文字:

If the target class implements one or more interfaces, then Spring will create a JDK dynamic proxy that implements every interface. If the target class implements no interfaces, Spring will use CGLIB to create a new class on the fly that is a subclass (“extends”) the target class. This leads to one important difference: a JDK dynamic proxy cannot be casted to the original target class because it’s simply a dynamic proxy that happens to implement the same interface(s) as the target. This has the effect of “nudging” you to program to interfaces if they’re being used in your application’s model, since proxies will usually be invoked through those interfaces 如果被调用者没有实现接口,而我们还是希望利用动态代理机制,那么可以考虑其他方式。我们知道 Spring AOP 支持两种模式的动态代理,JDK Proxy 或者 cglib,如果我们选择 cglib 方式,你会发现对接口的依赖被克服了。

cglib的优势
  • 在被代理类不便实现接口时,cglib可以实现代理
  • 只需操作我们关心的类,不需要增加其他的类
  • 性能较反射更高
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态代理是基于什么原理?
编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。
灬沙师弟
2022/10/07
7451
从根上理解Cglib与JDK动态代理
最近在阅读到了Spring源码对于两种动态代理使用在不同场景下的使用,两种方式各有利弊写一篇文加深自己的认识。文中对于源码的涉及较少,更多的是作者自己的理解和举例,然后通过部分源码验证。
科技新语
2023/03/07
4330
java学习笔记(中级篇)—JDK动态代理
相信大家都知道代理商这个概念,在商业中,代理商无处不在。假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商。你要买或者定制什么产品,需要什么规格样式和价格的直接跟代理商沟通就好了,由代理商与真实的厂商沟通,这样买家有什么问题都可以咨询代理商,真实厂商也就可以专心做产品,不需要管其他事务了,买家也插手不了厂商的事。
chlinlearn
2019/09/12
3280
代理、静态、动态
为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对象 (委托类) 中介作用。
张小驰出没
2021/12/06
2380
代理、静态、动态
Java 动态代理 原理解析
概要 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。Spring中的动态代理是使用Cglib进行实现的。我们这里分析的是JDK中的动态代理实现机制。 下面我们通过例子快速了解JDK中的动态代理实现方式。 示例 需要代理的接口 public interface IHello { public void sayHello(); } 需要代理的类 p
java404
2018/05/18
6810
JDK动态代理
这里是最简单的Java接口和实现类的关系,此时可以开始动态代理了,一般会分为两个步骤:第一是建立代理对象和真实服务对象的代理和被代理关系,第二步是实现代理对象具体方法的逻辑。
itlemon
2020/04/03
5240
【小家Java】JDK动态代理技术,你真学会了吗?(Proxy、ProxyClassFactory)
动态代理技术,相信我们都并不陌生。特别是在Spring框架内,大量的使用到了反射以及动态代理技术。但是如果我们只是停留在平时的运用阶段,此篇文章你其实是可以跳过的,因为反射、代理技术一般都只有在框架设计中才会使用到,业务开发是不用接触的。
YourBatman
2019/09/03
4380
【小家Java】JDK动态代理技术,你真学会了吗?(Proxy、ProxyClassFactory)
谈谈反射机制,动态代理基于什么原理
反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
王小明_HIT
2020/05/08
7580
谈谈反射机制,动态代理基于什么原理
Java中动态代理机制
代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色。代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。
Bug开发工程师
2020/02/13
5980
动态代理(1)
代理模式是一种比较好的理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
黑洞代码
2021/01/19
2330
动态代理
代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。 举例:春季回家买票让人代买,租房找中介 动态代理:在程序运行过程中产生的这个对象 如何让程序在运行过程中帮我们动态地产生这个对象呢?可以通过Java的反射实现。
星哥玩云
2022/09/14
2930
动态代理
浅谈 Java 动态代理
Proxy Pattern是程序设计中的一种设计模式,又称委托模式。代理对象对真实对象提供一种代理以控制其他对象对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。、
ph0ebus
2023/05/16
2850
浅谈 Java 动态代理
动态代理
在原有程序不变的情况下通过动态代理增加新的功能(功能增强) 减少代码的重复 专注业务逻辑代码 解耦合,让业务功能和日志,事务非业务功能分离 jdk动态代理实现案例 使用JDK中的Proxy,Method,InvocationHanderl创建对象。 JDK动态代理要求目标类必须实现接口 SomeService public interface SomeService { void doSome(); void doOther(); } SomeServiceImpl public class
shaoshaossm
2022/12/26
1580
动态代理技术的运用
“ 在前一篇文章我们了解了Spring AOP的简单运用,我们发现面向切面编程的核心是动态代理,我们这篇文章主要就是看一下:JDK自带的动态代理和CGLIB的动态代理”
每天学Java
2020/06/02
2950
Java 动态代理原理
被代理类和代理类都实现同一个接口,通过在代理类对象中注入一个被代理对象,通过调用代理对象的方法,在其方法中间接调用被代理对象,从而实现代理的作用。
菜皮日记
2023/12/18
1300
Java 动态代理原理
【面试系列】JDK动态代理和CGLIB静态代理 - Java技术债务
是否在面试过程中经常被问到Spring的代理的问题:比如说几种代理方式?两种代理方式的区别?或者问为什么JDK动态代理只能代理接口?
Java技术债务
2024/06/21
1140
【面试系列】JDK动态代理和CGLIB静态代理 - Java技术债务
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战
这里推荐一篇实用的文章:《Java 读取寄存器数据的实现与应用》,作者:【喵手】。
小马哥学JAVA
2024/11/21
1960
Java代理相关:JDK动态代理、CGLIB动态代理
代理(Proxy)是一种设计模式,提供了对目标对象另外的一种访问方式。可以在目标对象实现的基础上,增加额外的功能操作,即扩展目标对象的功能。
lpe234
2020/07/27
4130
深入浅出动态代理
代理模式是为了提供额外或者不同的操作,而插入代替”实际对象”的对象,即代理类,针对代理类的调用操作,都会涉及到与”实际对象”的通信,代理类起到中间人的作用。Java动态代理比代理的思想更进一步,它可以动态的创建代理类并处理对”实际对象”的调用,Java动态代理底层基于Proxy/InvocationHandler相关类和反射技术。
luoxn28
2019/11/06
5030
静态代理和动态代理简介
在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。 代理模式的角色分为: 主题接口: 即代理类的所实现的行为接口。 目标对象: 也就是被代理的对象。 代理对象: 用来封装真是主题类的代理类 客户端:即用来实现的类
SmileNicky
2019/01/17
4960
相关推荐
动态代理是基于什么原理?
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验