Java的Proxy,一种思考和解决问题的方法

news/2024/11/8 3:26:42/

代理模式

    • 静态代理
      • 功能列表(接口)
      • 原有功能,功能的实现
      • 在不破坏原功能的情况下Enhance
      • Test
    • JDK 动态代理
    • Cglib 代理模式
      • Callback的MethodInterceptor
      • test

静态代理

在不破坏原有功能的情况下,进行升级改造。
使用场景,通常在旧项目改造和升级中,不能或者没有条件在源码的基础上升级和改造
所以用代理模式是一个不错的选择。

功能列表(接口)

public interface IDoing {public String doFirst();public void doSecond();
}

原有功能,功能的实现

@Slf4j
public class DoingImpl implements IDoing {@Overridepublic String doFirst() {String me = "Hi there,this is Michael";return me;}@Overridepublic void doSecond() {log.info("let's started now");}
}

在不破坏原功能的情况下Enhance

public class DoingProxy implements IDoing {private IDoing idoing;DoingProxy(){this.idoing = new DoingImpl();}@Overridepublic String doFirst() {return idoing.doFirst().toUpperCase();}@Overridepublic void doSecond() {idoing.doSecond();}
}

Test

@Slf4j
public class TestProxy {public static void main(String[] args) {IDoing idoing = new DoingImpl();IDoing idoing = new DoingProxy();log.info(idoing.doFirst());idoing.doSecond();}
}

Hi there,this is Michael
HI THERE,THIS IS MICHAEL
let’s started now

JDK 动态代理

在静态代理的基础上改造

@Slf4j
public class TestProxy {public static void main(String[] args) {IDoing target = new DoingImpl();IDoing proxyIdoing = (IDoing) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(target, args);if (result!=null) {result = result.toString().toUpperCase();}return result;}} );String doFirst = proxyIdoing.doFirst();log.info(doFirst);proxyIdoing.doSecond();}
}

Cglib 代理模式

Callback的MethodInterceptor

public interface MethodInterceptor extends Callback

public class CglibProxyEnhancer implements MethodInterceptor {public DoingImpl getCglibCreator() {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(DoingImpl.class);enhancer.setCallback(this);return (DoingImpl) enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {Object result = method.invoke(new DoingImpl(), args);if (result!=null) {result = result.toString().toUpperCase();}return result;}
}

test

@Slf4j
public class TestProxy {public static void main(String[] args) {CglibProxyEnhancer cglibProxyEnhancer = new CglibProxyEnhancer();DoingImpl proxyIdoing = cglibProxyEnhancer.getCglibCreator();String doFirst = proxyIdoing.doFirst();log.info(doFirst);proxyIdoing.doSecond();}
}

http://www.ppmy.cn/news/83270.html

相关文章

Hyperledger Fabric理解

在Hyperledger Fabric中,Peer和Orderer是两个不同的角色,它们各自扮演不同的角色,但也需要相互协同合作来支持Fabric网络的顺畅运行。 Peer是Hyperledger Fabric网络中负责维护分类帐(Ledger)、安装链码(C…

已经有MySQL了,干嘛还要学MongoDB?

三分钟的时间,通过本文你将学会 1.MongoDB主要特征 2.MongoDB优缺点,扬长避短 3.何时选择MongoDB?为啥要用它? 4.MongoDB与MySQL关键字对比 5.下载与安装MongoDB 6.Java整合MongoDB,实现增删改查 MongoDB和MySQ…

Java设计模式七大原则-开放-关闭原则

✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 开放-关闭原则 1、开闭原则介绍 在Java中的开放-关闭原则(Open-Closed Principle, OCP)是一个重要原则。该…

【业务功能篇01】Springboot+mybatis-plus+POI实现表单数据导出Excel

业务中常见的一个功能,前台附有多个筛选器,提供筛选过滤表单数据,然后点击导出按钮进行导出: 下面演示举例实例: 用户通过前端参数传参后,查询出一个表单数据,假设为表A,这个表A是一个问题单表,每个问题会对应有多个小问题单,比如ANo是该问题单号, 而subNo字段就是对…

设计模式 -第1部分 避免浪费- 第1章 Flyweight 模式 - 共享对象避免浪费

第1部分 避免浪费 注:其内容主要来自于【日】-结城浩 著《图解设计模式》20章节 极力推荐大家阅读原著 第1章 Flyweight 模式 - 共享对象避免浪费 1.1 Flyweight 模式 Flyweight 的意思"轻量级",其在英文中的原意指比赛中选手体重最轻等级的一…

正确甄别API、REST API、RESTful API和Web Service之间的异同

看到API你会想起什么?是接口、第三方调用、还是API文档?初看你可能会觉得这太熟悉了,这不是系统开发日常系列吗?但你仔细想一想,你会发现API的概念在你脑海里是如此的模糊。如何你通过搜索引擎检索API,你会…

Try ‘apt --fix-broken install’ with no packages解决办法

在Ubuntu中用apt-get安装软件,系统报出Unmet dependencies错误。 Unmet dependencies. Try ‘apt --fix-broken install’ with no packages (or specify a solution) 解决方案如下: sudo apt --fix-broken install sudo apt-get update sudo apt-get u…

Ubuntu20.04配置静态IP地址,开启远程连接

本文操作演示为windows系统使用虚拟机安装的ubuntu系统进行:操作系统为ubuntu20.04,VMware15.5.0 build-14665864,内容分为两部分,第一部分为配置ubuntu系统的静态ip地址,第二部分内容为修改配置开启远程连接功能 一、…