Java的三种代理模式简述

Java的三种代理模式简述

Java的三种代理模式为静态代理、动态代理和CGLIB代理。

一、静态代理

静态代理指的是代理对象在编译期已经确定的情况下所使用的代理模式。代理类与委托类实现了相同的接口,代理类对目标对象进行了包装,所以在调用目标对象时需要通过代理对象来执行。静态代理在性能方面较差,但是实现较为简单,常用于简单业务场景。

示例:

interface Subject {
    void request();
}

class RealSubject implements Subject{

    @Override
    public void request() {
        System.out.println("RealSubject request.");
    }
}

class ProxySubject implements Subject{

    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject){
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        System.out.println("ProxySubject request.");
        realSubject.request();
    }
}

public class Test {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        ProxySubject proxySubject = new ProxySubject(realSubject);
        proxySubject.request();
    }
}

二、动态代理

动态代理指的是在运行时对目标对象进行包装的代理模式,相比于静态代理,动态代理无需手动编写代理类,可根据目标对象的接口,动态的创建代理对象,并在代理对象中动态的处理方法调用、参数校验等逻辑。由于动态代理是在运行时创建的代理对象,所以性能较静态代理有所提升。常用于需要动态创建代理对象的场景。

示例:

interface Subject {
    void request();
}

class RealSubject implements Subject{

    @Override
    public void request() {
        System.out.println("RealSubject request.");
    }
}

class DynamicProxy implements InvocationHandler{

    private Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("DynamicProxy before.");
        Object result = method.invoke(target, args);
        System.out.println("DynamicProxy after.");
        return result;
    }
}

public class Test {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
        Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), dynamicProxy);
        proxySubject.request();
    }
}

三、CGLIB代理

CGLIB代理是一种针对类来实现代理的方式,通过生成目标对象的子类来实现代理逻辑。使用CGLIB代理时,被代理对象无需实现任何接口,因为生成的代理类是继承于目标对象的子类,所以可直接操作目标对象的全部属性和方法。由于采用字节码生成技术,CGLIB代理的性能通常比JDK动态代理性能更高。常用于需要代理类的场景。

示例:

class RealSubject {

    public void request() {
        System.out.println("RealSubject request.");
    }
}

class CglibProxy implements MethodInterceptor{

    public Object createProxy(Class<?> targetClass){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("CglibProxy before.");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("CglibProxy after.");
        return result;
    }
}

public class Test {
    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        RealSubject proxySubject = (RealSubject)cglibProxy.createProxy(RealSubject.class);
        proxySubject.request();
    }
}

以上就是Java中三种代理模式的详细介绍及示例。

阅读剩余 65%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的三种代理模式简述 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Vue.js递归组件实现组织架构树和选人功能

    下面是关于 Vue.js 递归组件实现组织架构树和选人功能的完整攻略。 什么是 Vue.js 递归组件 Vue.js 的递归组件是指在组件的模板中可以调用组件自身的一种特殊组件。通过使用递归组件,可以在联动结构中轻松地构建无限级别的嵌套组件和树形结构。 实现组织架构树和选人功能的步骤 数据结构的设计 组织架构树通常是按照树形结构设计的,所以在 Vue.js …

    other 2023年6月27日
    00
  • Golang应用程序性能优化技巧分享

    Golang应用程序性能优化技巧分享 本文将详细介绍如何对 Golang 应用程序进行性能优化,以提高应用程序的性能和效率。本攻略将介绍以下步骤: 分析应用程序性能问题 使用性能分析工具优化应用程序 实践优化技巧和实例 分析应用程序性能问题 分析应用程序的性能问题非常重要,我们需要找到导致应用程序性能瓶颈的因素。我们可以使用一些工具和技术来获取应用程序的性能…

    other 2023年6月25日
    00
  • 电脑资源管理器的右键上下文菜单打不开的两种解决办法

    以下是详细的攻略: 问题描述 在使用电脑资源管理器时,右键点击文件或文件夹,却无法弹出上下文菜单,或者弹出但是无法选中任何项,这是一个常见的问题。 可能原因 第三方程序添加了不兼容的菜单项导致菜单崩溃。 Windows资源管理器文件缓存损坏导致菜单无法正常加载。 解决方案 解决方案1:通过命令重建缓存 点击“开始菜单”,在搜索栏中输入“cmd”并以管理员权限…

    other 2023年6月27日
    00
  • PHP之变量、常量学习笔记

    PHP之变量、常量学习笔记 变量 定义变量 在PHP中,变量用于存储数据。在使用变量之前,需要先定义它们。变量的定义需要使用$符号,后面跟上变量名。 $age = 25; $name = \"John\"; 变量命名规则 变量名必须以美元符号$开头。 变量名只能包含字母、数字和下划线。 变量名不能以数字开头。 变量名区分大小写。 变量赋值…

    other 2023年8月9日
    00
  • QQ空间说说手机自定义标识代码汇总及使用方法大全

    QQ空间说说手机自定义标识代码汇总及使用方法大全 什么是QQ空间自定义标识? 在QQ空间中,自定义标识可以让用户在发表说说时添加一些特殊的效果,比如添加背景图片、表情、个性化边框等等。使用自定义标识可以使得你的说说更加丰富有趣,增加互动和好感度。 QQ空间自定义标识的使用方法 在发表说说的时候,可以在文本框上方找到自定义标识按钮,点击即可弹出自定义标识面板。…

    other 2023年6月25日
    00
  • iOS10.0.2升级需要多大空间 更新升级iOS 10.0.2正式版需要占用多大内存

    升级iOS 10.0.2需要的空间取决于您的设备型号和当前运行的操作系统版本。一般来说,iOS 10.0.2的升级文件大小约为200-300 MB。然而,为了成功完成升级,您需要更多的可用存储空间。 以下是升级iOS 10.0.2的完整攻略: 检查可用存储空间:在升级之前,您应该检查设备上的可用存储空间。打开设置应用程序,然后转到“通用”>“存储空间与…

    other 2023年8月1日
    00
  • ios是什么意思?

    iOS,全称为iPhone Operating System,是由苹果公司开发的移动操作系统,运行在iPhone、iPad、iPod Touch等设备上,是目前全球最流行的操作系统之一。 iOS的特点包括易用性、流畅性和安全性。与其他操作系统相比,iOS系统使用起来更加简单,不需要太多的学习成本。同时,iOS的界面流畅度也很高,用户在使用过程中很少会遇到卡顿…

    其他 2023年4月16日
    00
  • 电脑重启 更换CPU风扇引起的电脑自动重启解决方法

    电脑重启 更换CPU风扇引起的电脑自动重启解决方法 背景 有时电脑可能会因为硬件问题、系统问题等原因出现自动重启的情况。在更换CPU风扇后,也可能会引发电脑自动重启的问题。本文将介绍通过排除硬件故障和软件设置等方法来解决电脑重启 更换CPU风扇引起的电脑自动重启问题。 硬件问题排除 首先,我们需要检查一下电脑硬件是否有故障。可以尝试的方式包括: 检查电脑内部…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部