当前位置: 首页 > news >正文

php网站开发视频教程上海到北京火车时刻表查询

php网站开发视频教程,上海到北京火车时刻表查询,公司变更法人后原法人还有责任吗,wordpress调用菜单函数代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静…

        代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静态代理和动态代理,本文将详细探讨这两种代理模式。

本文目录

    • 一、静态代理
      • 1. 代码实现
      • 2. 优缺点
    • 二、动态代理
      • 1. JDK动态代理实现
      • 2. CGLIB动态代理

一、静态代理

静态代理是指在编译时就已经确定代理类和目标类的关系。代理类和目标类都需要实现相同的接口,代理类中持有目标类的引用,在代理类的方法中调用目标类的相应方法,并可以在调用前后添加额外的逻辑。

1. 代码实现

// 定义接口
interface UserService {void addUser();void deleteUser();
}// 实现类
class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println("添加用户");}@Overridepublic void deleteUser() {System.out.println("删除用户");}
}// 静态代理类
class UserServiceProxy implements UserService {private UserService target;public UserServiceProxy(UserService target) {this.target = target;}@Overridepublic void addUser() {System.out.println("添加用户前的日志记录");target.addUser();System.out.println("添加用户后的日志记录");}@Overridepublic void deleteUser() {System.out.println("删除用户前的日志记录");target.deleteUser();System.out.println("删除用户后的日志记录");}
}public class StaticProxy {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = new UserServiceProxy(target);proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

在代理类的方法中,调用目标对象的方法前后添加了日志记录的逻辑

2. 优缺点

  • 优点:实现简单,易于理解,在编译时就可以确定代理关系,性能相对较高。
  • 缺点:代理类和目标类必须实现相同的接口,当接口方法发生变化时,代理类和目标类都需要修改。而且如果需要代理多个不同的目标类,就需要为每个目标类创建一个对应的代理类,代码会变得冗余。



二、动态代理

动态代理是指在运行时动态生成代理类,而不需要在编译时就确定代理类的代码。Java提供了两种实现动态代理的方式:JDK 动态代理和 CGLIB 动态代理。

1. JDK动态代理实现

JDK 动态代理是基于接口的动态代理,它使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface UserService {void addUser();void deleteUser();
}class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println("添加用户");}@Overridepublic void deleteUser() {System.out.println("删除用户");}
}// 自定义InvocationHandler
class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method.getName() + " 方法调用前的日志记录");Object result = method.invoke(target, args);System.out.println(method.getName() + " 方法调用后的日志记录");return result;}
}public class JdkDynamicProxy {public static void main(String[] args) {UserService target = new UserServiceImpl();MyInvocationHandler handler = new MyInvocationHandler(target);UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

这种方式不需要为每个目标类创建代理类,只需要实现 InvocationHandler 接口,就可以为多个目标类提供代理服务。只能代理实现了接口的类,不能代理没有实现接口的类。

2. CGLIB动态代理

CGLIB 动态代理是基于继承的动态代理,可以代理没有实现接口的类。CGLIB是一个强大的、高性能的代码生成库,通过继承目标类来生成代理类。

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;// 目标类
class UserService {public void addUser() {System.out.println("添加用户");}public void deleteUser() {System.out.println("删除用户");}
}// 自定义MethodInterceptor
class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(method.getName() + " 方法调用前的日志记录");Object result = proxy.invokeSuper(obj, args);System.out.println(method.getName() + " 方法调用后的日志记录");return result;}
}public class CglibDynamicProxy {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new MyMethodInterceptor());UserService proxy = (UserService) enhancer.create();proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

可以代理没有实现接口的类,灵活性更高,但是由于是基于继承实现的,所以不能代理 final 类和 final 方法。



← 上一篇 Java进阶——常用类及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数组超详细整理 →
http://www.dtcms.com/a/400860.html

相关文章:

  • 十大视频剪辑软件排行榜上海网站建设乐云seo模板中心
  • 网站图片幻灯片效果做响应式网站是不是都用rem
  • 学校网站建设分析漳州建设银行网站首页
  • 网站开发参考资料火车头 wordpress 4.7
  • 汽车配件外贸网站泰安市住房和城乡建设厅网站
  • 制冷型红外热成像在VOC气云成像与泄漏检测的应用
  • 网站建设完成确认书设计腕儿官网
  • 专业的营销型网站定制外贸行业网站推广
  • 贵阳网站建设q.479185700棒wordpress用户模块
  • 建设网站公司那里好华艺网络网站开发
  • 中小企业的网站建设论文网站培训网站建设
  • 杭州亚运村建设指挥部网站上海网站建设搜q.479185700
  • 怎么做捐款网站主题资源网站建设
  • 服装网站建设的宗旨有哪些建设工程施工合同是专属管辖吗
  • 营口沿海开发建设有限公司网站做宣传册模板的网站
  • 凡科建站ps做的图片能做直接做网站吗
  • 郑州网站制作-中国互联好的app制作公司
  • 如何系统性的学习RAG、Agent、MCP?
  • 徽省建设干部学校网站中国航天科工集团有限公司
  • 教育培训网站模板网站维护公司推荐
  • 网站建设产品说明书展示性公司网站html
  • 家具行业网站整站模板网站焦点图怎么做链接
  • 免费1级做爰片免费网站网页设计总结收获和体会
  • synology做网站服务器常熟港口建设费申报网站
  • 使用unity做网站公司名称大全及最新
  • 银川网站开发推广企业找建筑师设计房子
  • 品牌网站建设解决方案上海建设行政主管部门政务网站
  • 网站seo运营WordPress评论后不会跳转
  • 怎么用网页制作一个网站做网站要写代码吗
  • 做网站思路做网站会提供源代码吗