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

jdk动态代理实现原理(二)

       下面对jdk动态代理实现进一步进行优化,考虑方法有返回值的情况,最终的实现类似于源码。

1.接口

    interface Foo{void foo();int bar();}interface InvocationHandler{Object invoke(Object proxy,Method method, Object[] args) throws Throwable;}

          Foo接口的产生变化,bar方法返回值为int。InvocationHandler接口的invoke方法增加参数Object proxy,可以传入代理对象。

2.目标类

   static class Target implements Foo{@Overridepublic void foo() {System.out.println("target foo");}@Overridepublic int bar() {System.out.println("target bar");return 1;}}

            重写bar方法要有返回值。

3.代理类

public class $Proxy0 implements Foo {private InvocationHandler h;public $Proxy0(InvocationHandler h){this.h = h;}@Overridepublic void foo() {try {h.invoke(this,foo,new Object[0]);}catch (RuntimeException | Error e){throw e;}catch (Throwable e) {throw new UndeclaredThrowableException(e);}}@Overridepublic int bar() {try {Object invoke = h.invoke(this, bar, new Object[0]);return (int)invoke;}catch (RuntimeException | Error e){throw e;}catch (Throwable e) {throw new UndeclaredThrowableException(e);}}static Method foo;static Method bar;static {try {foo = Foo.class.getMethod("foo");bar = Foo.class.getMethod("bar");} catch (NoSuchMethodException e) {throw new NoSuchMethodError(e.getMessage());}}
}

            把方法对象的获取抽象成静态代码块,同时进行更精确的异常捕获。

4.主类

 public static void main(String[] params) {Foo proxy = new $Proxy0(new InvocationHandler() {@Overridepublic Object invoke(Object proxy,Method method, Object[] args) throws Throwable {//功能增强System.out.println("before....");//调用目标return method.invoke(new Target(),args);}});proxy.foo();proxy.bar();}

结果:

http://www.dtcms.com/a/540390.html

相关文章:

  • 上海旅游网站建设精通网站开发
  • 营销型网站建设的优缺点广州建站代运营公司有哪些
  • 6.1.1.4 大数据方法论与实践指南-Flink 任务优化实践
  • 面向中小企业的大模型推理引擎:技术架构与应用实践
  • Object-C 中的证书校验
  • PCIe协议之 SMBus 信号线
  • 赋能国防航天,数字孪生IOC ProMAX版如何重塑智能指挥与运维新标杆
  • GXDE 内核管理器1.0.0——支持 deepin20、23
  • 声呐到底怎么选?
  • 做购物网站是怎么连接银行公众号怎么做小程序
  • 吉林省城乡建设官方网站网站后台修改教程
  • saas模板使用教程
  • 在CentOS 7.9上升级OpenSSH到9.9p2
  • asp 网站支持多语言想建立一个网站
  • Spring Boot3零基础教程,Spring Security 简介,笔记80
  • 调试技巧:从 IDE 调试到生产环境定位问题,提升调试效率的全方位指南
  • 服务器和docker容器时间不一致相关问题
  • Vue+Element Plus 表格工具栏组件:动态按钮 + 搜索控制的优雅实现​
  • 上海网站建设平台什么是seo标题优化
  • 网络编程之WebSocket(1)
  • Electron_Vue3 自定义系统托盘及退出二次确认
  • 为什么 Electron 项目推荐使用 Monorepo 架构 [特殊字符][特殊字符][特殊字符]
  • BLIP2 工业实战(一):从零实现 LAVIS 跌倒检测 (微调与“踩坑”指南)
  • NPM下载和安装图文教程(附安装包)
  • 2025 年台湾 5 大 CDP 平台推荐比较
  • 【数据结构】栈(Stack)详解——数据结构的“后进先出”
  • Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用
  • Bootstrap4 安装使用指南
  • 怎么建设购物网站免费入驻的网站设计平台
  • vue2 将接口返回数据导出为 excel 文件