虽然静态代理需要手动的去创建,但动态代理也需要我们去实现InvocationHandler。

虽然静态代理需要手动的去创建,但动态代理也需要我们去实现InvocationHandler。

问题描述:

课程中提及"作为静态代理他哪都好,但是不灵活,因为我们有一个目标类就要去创建至少一个代理类如果系统的目标类很多的话,这些代理类也会变得非常的复杂"。


但是这对于动态代理难道不是一样的么?我们对于不同的目标类有不同的需求,我们就需要对InvocationHandler进行各种不同实现。如果未来有扩展,我们还得去修改实现InvocationHandler类的源代码,而静态代理可以直接嵌套完成扩展不需要触碰源码的修改


这样的话,动态代理不是和静态代理一样,有多少目标类就要多少适配相关需求的实现,只不过一个是直接手写了代理类实现,一个是通过JDK提供的反射类InvocationHandler对目标类进行增强需要我们手动的去实现InvocationHandler并手动的来启动自动生成代理类。

那这样看,动态代理没有对于静态代理的优势啊。请问我的理解有误吗?如何理解动态代理是比静态代理更有优势呢?(感觉上动态代理比静态代理写了更多的代码,结构也没有静态代理直白,也不能嵌套?)

(谢谢老师)

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,当多个类需要拓展的业务逻辑不同时,使用静态代理和使用动态代理本质上是没有区别的,都是要手动书写代理类代码。但是当多个类需要拓展的业务逻辑相同的时候,静态代理依然必须逐一进行拓展,但是动态代理就可以通过反射使用一个类就完成拓展了。

另外,动态代理也是可以进行嵌套的,如下代码中,第一行就是创建了委托类的实现类对象,所以实质上和静态代理一样,也是持有了委托类的实例。当使用动态代理嵌套时,只需要将这里进行替换即可。

https://img1.sycdn.imooc.com//climg/64ae06d90952aaa015620511.jpg

祝学习愉快~

  • 只能卷了 提问者 #1

    理解了,逻辑相同时,动态代理可以复用,而静态代理要对每一个新类进行相关代理类的创建。

    第二个地方我还是不太确定自己是否理解正确。假设我已经实现了另一个InvocationHandler,名为ProxyInvocationHandler1。

    代码如下:

            //第一层
            UserService userService = new UserServiceImpl();
            ProxyInvocationHandler invocationHandler = new ProxyInvocationHandler(userService);
            UserService userServiceProxy = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
                    userService.getClass().getInterfaces(),
                    invocationHandler);
            //第二层
            ProxyInvocationHandler1 invocationHandler1 = new ProxyInvocationHandler1(userServiceProxy);
            UserService userServiceProxy1 = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
                    userService.getClass().getInterfaces(),
                    invocationHandler1);
            userServiceProxy1.createUser();

    第二层是使用了第一层生成的userServiceProxy作为构造方法的参数去实例化ProxyInvocationHandler1,但后开始代理类的自动创建,传入的依旧是userService的构造器和接口,因为我需要的是让第二层代理处理第一层代理的接口,最后传入的是invocationHandler1。自动生成的代理类所持有的对象就是以userServiceProxy为基础(持有userServiceProxy在堆中地址的引用)。然后调用createUser()时就会逐层递进,一直到调用完原本的createUser()再逐级跳转回来完成userServiceProxy和userServiceProxy1的调用。这样理解是否正确?

    2023-07-12 22:02:36
  • 好帮手慕小尤 回复 提问者 只能卷了 #2

    同学你好,同学理解是正确的,嵌套多层代理可能会导致性能上的开销增加,需要谨慎使用。

    祝学习愉快!

    2023-07-13 13:24:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师