厦门网站j建设中建官网

张小明 2026/3/2 20:01:33
厦门网站j建设,中建官网,中国佛山营销网站建设,网络营销的有哪些特点代理模式 Proxy 核心定义, 代理模式就是为其他对象提供一种代理, 用来控制对这个对象的访问 代理模式的关键在于分离使用者与目标实例, 作为中间层, 除了调用目标实例的所有功能外, 还能封装其他功能. 和现实情况很像, 类似于消费者和现金的关系, 消费者可以带着现金直接消费, …代理模式 Proxy核心定义, 代理模式就是为其他对象提供一种代理, 用来控制对这个对象的访问代理模式的关键在于分离使用者与目标实例, 作为中间层, 除了调用目标实例的所有功能外, 还能封装其他功能.和现实情况很像, 类似于消费者和现金的关系, 消费者可以带着现金直接消费, 但是当有大额消费时, 带着很多钱, 既不安全也不方便, 这时我们需要一张银行卡, 用银行卡进行各种复杂的交易就方便了很多.代理模式分为静态代理模式和动态代理模式两种类型静态代理模式: 通过实现接口或继承目标类的方式实现代理功能.动态代理模式: 利用反射机制或CGLIB动态获取代理类的功能接口静态代理类的接口随着目标类接口变化而变化, 不够灵活动态代理类能够自动获取目标类的接口变化, 非常灵活实际开发过程中, 动态代理模式的使用场景更多.静态代理模式: 通过实现目标类共同接口的方式实现publicclassProxyPattern{publicstaticvoidmain(String[]args){// 先实例化目标对象TextLoggerloggernewTextLogger();// 再实例化代理类, 并传入目标对象TextLogProxyproxynewTextLogProxy(logger);// 使用时, 通过代理类的实例对象调用log方法proxy.log();}}// 目标类统一接口interfaceLoggerInterface{voidlog();}// 目标类实现classTextLoggerimplementsLoggerInterface{// 这里使用log方法代表目标类中非常复杂的操作Overridepublicvoidlog(){System.out.println([text] log into text file.);}}// 代理类, 通过继承和目标类相同的接口, 实现代理classTextLogProxyimplementsLoggerInterface{// 这里持有目标类的接口引用, 而不是TextLogger引用, 这样扩展性更好一点LoggerInterfacetextLogger;TextLogProxy(LoggerInterfaceobj){this.textLoggerobj;}// 代理类相同的log方法前后会封装一些其他的逻辑Overridepublicvoidlog(){System.out.println([before] doing complicate things....);// 代理类中的log方法没有具体实现, 而是调用目标类对象中的方法textLogger.log();System.out.println([after] job done.);}}运行结果[before] doing complicate things.... [text] log into text file. [after] job done.上述方式是静态代理模式下, 最常见也最推荐的实现方法.但如果目标类没有继承任何接口时, 要实现代理模式就要通过继承或聚合的方式来实现, 简要示例如下:静态代理模式: 通过继承目标类实现// 目标类无接口直接包含核心业务逻辑classTextLogger{// 核心业务方法publicvoidlog(){System.out.println([text] log into text file.);}}// 代理类继承目标类重写方法实现代理classTextLoggerProxyextendsTextLogger{Overridepublicvoidlog(){// 前置增强逻辑System.out.println([before] 校验日志权限、初始化资源...);// 调用父类目标类的核心方法super.log();// 后置增强逻辑System.out.println([after] 释放资源、记录日志状态...);}}静态代理模式: 通过聚合目标对象实现// 目标类无接口核心业务逻辑classTextLogger{publicvoidlog(){System.out.println([text] log into text file.);}// 目标类的其他方法publicvoidlogError(){System.out.println([text] log error into text file.);}}// 代理类聚合目标类无接口/继承classTextLoggerProxy{// 聚合持有目标类的引用privateTextLoggertarget;// 构造方法传入目标对象publicTextLoggerProxy(TextLoggertarget){this.targettarget;}// 定义与目标类相同的方法实现代理publicvoidlog(){// 前置增强System.out.println([before] 校验权限、初始化资源...);// 调用目标类的方法target.log();// 后置增强System.out.println([after] 释放资源、记录状态...);}}动态代理模式: 使用Java反射机制实现// 动态代理类: 手动实现java.lang.reflect.InvocationHandler包中的InvocationHandler接口classLogInvocationHandlerimplementsInvocationHandler{// 自定义目标对象, 并将其私有化privateObjectlog_obj;// 构造时传入目标对象LogInvocationHandler(Objectobj){this.log_objobj;}// 当调用log_obj对象中的方法时, 下面的invoke方法会被自动调用OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println([before] doing complicate thins....);Objecttarget_objmethod.invoke(log_obj,args);System.out.println([after] job done.);returntarget_obj;}// 生成代理对象publicstaticObjectcreateProxyObj(Objectlog_obj){// 通过调用Proxy包的newProxyInstance方法, 根据目标对象, 动态生成代理对象returnProxy.newProxyInstance(log_obj.getClass().getClassLoader(),// log_obj对象的类加载器log_obj.getClass().getInterfaces(),// log_obj对象所实现的接口(要求目标类对象必须实现自统一的接口)newLogInvocationHandler(log_obj)// 调用处理器);}}// 定义毫不相关的两种类, 两种统一接口interfaceLoggerInterface{voidlog();}interfacePaymentInterface{voidpay();voidlog();}// 接口LoggerInterface的类实现classTextLoggerimplementsLoggerInterface{// 这里使用log方法代表目标类中非常复杂的操作Overridepublicvoidlog(){System.out.println([text] log into text file.);}}// 接口PaymentInterface的类实现classAliPayimplementsPaymentInterface{Overridepublicvoidpay(){System.out.println([pay] doing Alipay success.);}Overridepublicvoidlog(){System.out.println([pay] log after pay.);}}调用实现:importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassProxyPattern{publicstaticvoidmain(String[]args){// 我们有两种不相关的类对象, 都可以通过自定义的动态代理类去调用它们TextLoggertextLoggernewTextLogger();AliPayalipaynewAliPay();// 这里要注意, Java 原生的动态代理java.lang.reflect.Proxy是基于接口生成代理对象的而不是基于实现类。// 所以这里获取代理对象后, 只能强转转为接口类型, 而不能转为实现类的类型// 获取textLogger的代理对象LoggerInterfacetextLoggerProxy(LoggerInterface)LogInvocationHandler.createProxyObj(textLogger);// 获取alipay的代理对象PaymentInterfacealipayProxy(PaymentInterface)LogInvocationHandler.createProxyObj(alipay);textLoggerProxy.log();System.out.println();alipayProxy.pay();alipayProxy.log();}}运行结果:[before] doing complicate thins.... [text] log into text file. [after] job done. [before] doing complicate thins.... [pay] doing Alipay success. [after] job done. [before] doing complicate thins.... [pay] log after pay. [after] job done.这里注意, 接口PaymentInterface中有两个方法, 每个方法被调用时,LogInvocationHandler.invoke方法都会被调用一次动态代理模式: 使用CGLIB库实现动态代理Java语法规定只能单继承, 而Proxy.newProxyInstance生成的动态代理类已经默认继承了java.lang.reflect.Proxy类这是 JDK 动态代理的底层实现要求, 因此动态代理类无法再继承, 只能通过实现接口的方式来保证方法的一致性.如果你的目标类没有实现任何接口, 可以使用CGLIB动态代理CGLIB位于单独的jar依赖包中, 需要从第三方获取基于maven包管理工具, 需要在项目依赖文件pom.xml文件中添加如下依赖:dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version/dependency示例如下:// 动态代理类 CglibInterceptor, 代理类名称自定义, 但必须实现MethodInterceptor方法classCglibInterceptorimplementsMethodInterceptor{Objectlog_obj;CglibInterceptor(Objectobj){this.log_objobj;}// 目标对象中的方法被调用时, 这里的intercept方法会被自动调用OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.println([before] some complicate code....);Objectobjmethod.invoke(log_obj,objects);System.out.println([after] job done.);returnobj;}// 生成动态代理对象publicstaticObjectcreateProxyObj(Objecttarget){EnhancerenhancernewEnhancer();// 设置父类为目标类CGLIB通过继承实现代理enhancer.setSuperclass(target.getClass());// 设置回调方法相当于InvocationHandler的invokeenhancer.setCallback(newCglibInterceptor(target));// 创建代理对象returnenhancer.create();}}// 两个毫不相关的类classTextLogger{// 这里使用log方法代表目标类中非常复杂的操作publicvoidlog(){System.out.println([text] log into text file.);}}classAliPay{publicvoidpay(){System.out.println([pay] doing Alipay success.);}publicvoidlog(){System.out.println([pay] log after pay.);}}调用示例:importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;importjava.lang.reflect.Method;publicclassProxyPattern{publicstaticvoidmain(String[]args){// 创建两个毫不相关的目标类TextLoggertextLoggernewTextLogger();AliPayalipaynewAliPay();// 通过基于CGLIB的动态代理类获取两个对象的代理对象TextLoggertextLoggerProxy(TextLogger)CglibInterceptor.createProxyObj(textLogger);AliPayalipayProxy(AliPay)CglibInterceptor.createProxyObj(alipay);textLogger.log();System.out.println();alipayProxy.pay();alipayProxy.log();}}运行结果:WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by net.sf.cglib.core.ReflectUtils$1 (file:/C:/Users/xuegu/.m2/repository/cglib/cglib/3.3.0/cglib-3.3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of net.sf.cglib.core.ReflectUtils$1 WARNING: Use --illegal-accesswarn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release [text] log into text file. [before] some complicate code.... [pay] doing Alipay success. [after] job done. [before] some complicate code.... [pay] log after pay. [after] job done.我是基于Java11环境运行的代码, 所以会出现上述警告, 提示使用了非法的反射原因是JDK 版本与 CGLIB 版本的兼容性问题导致的具体来说CGLIB 的底层实现依赖反射访问 JDK 的私有 / 受保护方法CGLIB 是通过 ASM 字节码框架生成目标类的子类作为代理类而生成字节码后需要通过ClassLoader.defineClass方法将字节码加载为 Class 对象。ClassLoader.defineClass是 JDK 中的受保护方法原本只能被 ClassLoader 的子类调用CGLIB 为了通用化调用这个方法使用了反射强行突破访问权限。JDK 9 及以上的模块化系统JPMS限制了非法反射访问JDK 9 引入了模块系统Java Platform Module System严格限制了代码通过反射访问其他模块的非公共 API包括 JDK 自身的内部 API、受保护 / 私有方法。当 CGLIB 用反射调用ClassLoader.defineClass时JDK 会检测到这种 “非法反射访问” 并抛出警告提示这种行为在未来的 JDK 版本中会被完全禁止。完美的解决方式暂时还没找到, 仅记录以上警告原因.
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

芙蓉网站制作深圳龙岗职业技术学校招生

🎮 还在为Windows掌机的游戏体验不佳而烦恼吗?Handheld Companion这款开源工具将彻底改变你的移动游戏方式!无论你是Steam Deck用户还是其他Windows掌机玩家,这个项目都能让你的设备发挥出100%的潜能。 【免费下载链接】HandheldC…

张小明 2026/1/19 6:44:13 网站建设

支付网站建设费怎么做账开放平台api

什么是大模型? 你是不是脑子里浮现的是 OpenAI、ChatGPT、DeepSeek?还有各式各样能跳个舞、可以翻个跟头的机器人?再深入点的,还能说出训练与推理。 有没有一种感觉:就是身边的信息都在声嘶力竭的鼓吹大模型正在改变世…

张小明 2026/1/19 6:43:42 网站建设

企业网站怎么查小程序推广收费价目表

实用脚本:电影信息查询、货币转换、比特币地址信息获取与网页变更跟踪 在日常的网络使用中,我们常常会有查询电影信息、进行货币转换、获取比特币地址信息以及跟踪网页变更等需求。下面将为大家介绍几个实用的脚本,帮助我们更高效地完成这些任务。 1. 电影信息查询脚本 m…

张小明 2026/1/19 6:43:11 网站建设

在建设部网站如何查询注册信息wordpress 如何 删除授权

1. 为什么这个毕设项目值得你 pick ?安全生产水利工程智慧管理系统的设计与实现,摆脱了传统“烂大街”选题的窠臼。该系统主要功能模块涵盖人员管理、设备管理及任务分配等多个方面,在提高工作效率的同时保证生产安全。普通员工和部门领导的角色分工明确…

张小明 2026/1/19 6:42:09 网站建设

搭建网站多少钱电子商务网站建设实训报告范文

VMware主机与客户机系统网络配置全解析 1. 网络配置概述 在VMware的主机 - 客户机操作系统交互中,网络是一个重要组成部分。虽然可以通过虚拟CD - ROM和软盘驱动器等虚拟设备进行简单的文件传输,但这些方式通常不太方便。VMware的网络功能让你能像在普通网络中的两台主机之…

张小明 2026/1/19 6:41:38 网站建设

网站响应式好吗芜湖市建设工程质量监督站官方网站

抖音下载器终极指南:快速上手批量无水印下载 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为下载抖音视频而烦恼吗?手动保存、去水印的繁琐操作让你望而却步?今天我…

张小明 2026/1/19 6:41:07 网站建设