代理模式-动态代理

简介: 动态代理概念动态代理和静态代理基本思路是一致的,只不过动态代理功能更强大,随着业务的扩展适应性更强。如果还以相亲为例,使用动态代理相当于是能够适应复杂的业务场景,不仅仅是父亲给儿子相亲,如果相亲这一业务发展成了一个产业,进而出现了媒婆、婚介所等这样的形式。那么,此时用的静态代理成本就更大了,需要一个更加通用的解决方案,要满足任何单身人士相亲的需求动态代理是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象。 在Java中要想实现动态代理机制,需要java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类的支持。

动态代理概念

动态代理和静态代理基本思路是一致的,只不过动态代理功能更强大,随着业务的扩展适应性更强。如果还以相亲为例,使用动态代理相当于是能够适应复杂的业务场景,不仅仅是父亲给儿子相亲,如果相亲这一业务发展成了一个产业,进而出现了媒婆、婚介所等这样的形式。那么,此时用的静态代理成本就更大了,需要一个更加通用的解决方案,要满足任何单身人士相亲的需求动态代理是在运行时,通过反射机制实现动态代理,并且能够代理各种类型的对象。 在Java中要想实现动态代理机制,需要java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy类的支持。

动态代理的特点

1.代理对象,不需要实现接口 2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型) 3.动态代理也叫做:JDK代理,接口代理

代码示例

代理工厂类:ProxyFactory.java,代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

public class ProxyFactory{
    //维护一个目标对象
    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }
   //给目标对象生成代理对象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("开始事务2");
                        //执行目标对象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("提交事务2");
                        return returnValue;
                    }
                }
        );
    }
}

动态代理的优缺点

  • 优点 动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强。
  • 缺点 Proxy已经设计得非常优美,但是还是有一点点小小的遗憾之处——它始终无法摆脱仅支持 interface代理的桎梏,因为它的设计注定了这个遗憾。动态生成的代理类的继承关系图,已经注定有一个共同的父类叫 Proxy。Java 的继承机制注定了这些动态代理类们无法实现对 class 的动态代理,原因是多继承在 Java 中本质上就行不通。

静态代理和动态代理的区别

静态代理只能通过手动完成代理操作,如果被代理类增加新方法,代理类需要同步新增方法,违背开闭原则 动态代理采用运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则 若动态代理需要对目标类的增强逻辑扩展,结合策略模式,只需新增策略类便可完成,无需修改代理类代码


目录
打赏
0
0
0
0
4
分享
相关文章
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
143 0
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
静态代理与动态代理
静态代理与动态代理
59 0
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
111 1
代理模式与动态代理
代理模式与动态代理
51 0
设计模式轻松学【七】JDK动态代理和Cglib动态代理
搞清楚静态代理的缺点十分重要,因为动态代理的目的就是为了解决静态代理的缺点。
140 0
设计模式轻松学【七】JDK动态代理和Cglib动态代理

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等