Proxy代理简单使用

使用Proxy实现织入额外代码

1.需要先定义接口和被代理类:

public interface UserBean {String getUser();String printStr(String name);
}

2.实现类

public class UserBeanImpl implements UserBean {private String user = null;public UserBeanImpl(){}public UserBeanImpl(String user) {this.user = user;}@Overridepublic String getUser() {System.out.println("this is getUser() method!");return user;}public void setUser(String user) {this.user = user;}@Overridepublic String printStr(String name) {System.out.println(name);return name;}
}

3.定义代理类UserBeanProxy,实现InvocationHandler接口的invoke方法,进行代码织入

public class UserBeanProxy implements InvocationHandler {/*** 被代理对象*/private Object target;public UserBeanProxy() {}public UserBeanProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//织入代码前置System.out.println("invoke proxy before biz");Object a = method.invoke(target, args);//织入代码后置System.out.println("invoke proxy after biz");return a;}
}

4.测试

public class TestBeanProxy {public static void main(String[] args) {//被代理对象  UserBeanImpl target = new UserBeanImple("ABC");//代理对象UserBeanProxy proxy = new UserBeanProxy(target);//创建代理对象实例Object instance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxy);//这里只能强转为接口String printStr = ((UserBean)instance).printStr("testArgs");System.out.println("printStr====" + printStr);}
}

RPC调用,只是引用了另外一个中心的服务api就能够调用另外一台机器的服务,就是使用了代理来实现底层的网络通信。下面的例子使用了泛型。clz是一个接口类newProxyInstance 的参数 使用了 new Class[]{clz}。如果是具体的实现类,可以使用clz.getInterfaces()来代替。如果入参是一个实例,可以通过target.getClass().getInterface()来处理。

public static <T> T getRpcProxyBean(Class<T> clz){return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[]{clz}, new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("实现网络请求逻辑");return null;}});}UserFacade userFacade = RpcProxy.getRpcProxyBean(UserFacade.class);

如果需要走一个对象里面的原逻辑,需要先实例化一个对象object(sourceBean)。

public static void main(String[] args) {TestProxy sourceBean = new TestProxyImpl();Object testProxy = createProxy2(sourceBean);String bbb = ((TestProxy)testProxy).printString("bbb");System.out.println(bbb);}public static Object createProxy2(Object object){Object instance = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("aaa1");Object ccc = method.invoke(object,args);System.out.println("aaa2");return "ccc";}});return instance;}

Proxy代理简单使用相关推荐

  1. 关于Vue 3.0 的改进 Proxy 代理实现数据驱动视图

    Vue 3.0 中使用了 Proxy 对象代理进行拦截实现了数据绑定视图的驱动操作.弥补了vue2.0中的局限,比如属性删除增加监听.对数组基于下标的修改.长度变化等等. 参考一下网上流传的机制图 P ...

  2. 静态代理,动态代理简单理解

    代理模式:是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之:在不修改源代码的前提下,对代 ...

  3. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  4. 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理

    豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...

  5. ES6之Proxy代理

    什么是Proxy代理 ES6 让开发者能进一步接近 JS 引擎的能力,这些能力原先只存在于内置对象上.语言通过代 理( proxy )暴露了在对象上的内部工作,代理是一种封装,能够拦截并改变 JS 引 ...

  6. Proxy代理 和 Reflect反射(反射的是obj)的概念

    1. Proxy代理 // 供应商(原始对象)let obj = {time:'2018-01-03',name:'net',_r: "123"}// 创建代理商,传入obj数据l ...

  7. es6的Proxy(代理)

    es6的Proxy(代理) Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作.一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处 //代理: var ...

  8. 分布式系统——zabbix 用 onealert实现报警、agent主动模式、proxy代理

    实验环境 物理机: rhel 7.3系统--172.25.54.250 server1:rhel 7.3系统--172.25.54.1 server2:rhel 6.5系统--172.25.54.11 ...

  9. ES6 Proxy的简单使用

    我们用new的方法对Proxy进行声明.可以看一下声明Proxy的基本形式. new Proxy({},{}); 需要注意的是这里是两个花括号,第一个花括号就相当于我们方法的主体,后边的花括号就是Pr ...

最新文章

  1. HTML5 模板推荐
  2. VIM: quickFix窗口的使用
  3. python到底可以做什么-Python到底可以做什么?
  4. 软考-信息系统项目管理师-量化的项目管理
  5. Java黑皮书课后题第5章:*5.39(金融应用:求销售总额)假设你正在某百货商店开始销售工作。你的工资包括基本工资和提成。基本工资是5000美元。你的目标是一年挣30000美元,编写程序找最小销售额
  6. Linux 免密码sudo
  7. 加密相关(对称加密、非对称加密、信息摘要、数字签名、CA数字证书)
  8. 如何在windows上搭建mysql_如何在Windows上安装多个MySQL
  9. Openresty各个阶段的执行次序
  10. 发现了学XML最好的素材
  11. 今年最值得期待的JavaScript传奇绿皮书登场!
  12. java语言打印上三角和下三角,进一步得到九九乘法表
  13. 操作系统如何恢复到原先状态
  14. 简单的 OpenGL 纹理贴图不起作用?
  15. 元宇宙构建基石:三维重建技术
  16. 三星n8000平板_三星n8000拆机方法介绍【图解】
  17. element ui 手动清除表单效验提示语
  18. mac 显示及隐藏文件的方法
  19. OSChina 周一乱弹 ——程序员已经习惯熬夜了吧
  20. A40i使用笔记:时区设置

热门文章

  1. 阿里云OSS上传下载和短信验证码
  2. 软件开发人员绩效评价标准
  3. 搭建windows下的php开发环境
  4. python爬取豆瓣图书Top250
  5. 冈萨雷斯《数字图像处理》学习笔记(4)--图像复原与重建(含傅里叶切片定理推导)
  6. Mac快捷键:文本,浏览器页面,终端terminal
  7. CSRF(跨站请求伪造)详解
  8. 如何解锁元宇宙?应用场景决定商业化变现
  9. Arduino—舵机控制
  10. Ofd文档要修改怎么办?可以转成Word吗