Byte-Buddy:方法拦截 InvoiceHandler 与 MethodDelegation 到 GeneralInterceptor

2024-04-25

我使用 Byte-Buddy 动态生成 Java 接口方法的实现,并将对这些方法的调用委托给现有代理对象的单个方法。

第一个版本的灵感来自如何使用 ByteBuddy 创建动态代理 https://stackoverflow.com/questions/40292185/how-to-create-a-dynamic-proxy-using-bytebuddy

它使用反射InvocationHandler

即具体代理类:

  • 实现接口InvocationHandler
  • 覆盖该方法invoke()

这很好用。

然后重新阅读Github 上的 Byte-Buddy 自述文件 https://github.com/raphw/byte-buddy我发现了一个替代版本MethodDelegation到“通用拦截器”。

即具体代理类:

  • 有一个方法标记为RuntimeType注解。

这也很好用!

下面的代码片段演示了这两种技术。

Class<? extends Object> clazz = new ByteBuddy()
    .subclass(serviceSuperClass)
    .name(className) 
    // use a Reflection InvocationHander for the methods of serviceInterfaceOne
    .implement(serviceInterfaceOne)
    .defineField(invocationHandler, MyProxy.class, Visibility.PUBLIC)
    .method(isDeclaredBy(serviceInterfaceOne))
    .intercept(InvocationHandlerAdapter.toField(invocationHandler))
    // use a Byte-Buddy "GeneralInterceptor" for the methods of serviceInterfaceTwo
    .implement(serviceInterfaceTwo)
    .defineField(generalInterceptor, MyProxy.class, Visibility.PUBLIC)
    .method(isDeclaredBy(serviceInterfaceTwo))
    .intercept(MethodDelegation.toField(generalInterceptor))
    //
    .make ()
    .load(classLoader)
    .getLoaded();
public class MyProxy implements InvocationHandler {

  @Override
  public Object invoke(Object serviceImpl, Method method, Object[] args) throws Throwable {
    return null;
  }  

  @RuntimeType
  public Object intercept(@AllArguments Object[] allArguments,
                          @Origin Method method) {
    return null;
  }
}

从高层次的角度来看,这两种技术都允许我做同样的事情:

即拦截给定的动态创建的方法到现有的具体方法。

两种解决方案都很优雅,并且所需的代码量相似。

问题是:是否有任何理由更喜欢其中一种而不是另一种?例如表现?功能性?


在这种使用形式中,除了委托可以连接到任何(静态或非静态)方法之外没有真正的区别,而调用处理程序适配器仅桥接 Java 代理 API 的实现。这主要意味着如果您已经实现了此类代理处理程序并希望通过 Byte Buddy 重用它们。

Byte Buddy 的处理程序比处理程序 API 提供了更大的灵活性,从而提高了性能,因为如果您知道需要什么参数,您就可以避免数组装箱。它还允许不同的机制,例如调用调用处理程序 API 不支持的默认方法实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Byte-Buddy:方法拦截 InvoiceHandler 与 MethodDelegation 到 GeneralInterceptor 的相关文章

  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐

  • FTPWebRequest .NET 3.5 与 4

    我有一个应用程序可以与 IBM 大型机建立 FTP 连接 并且一切都工作正常 然后 我针对 NET 4 重新编译 主机不再接受该文件 并给出一条错误消息 指出该文件不存在 或者我没有该文件的权限 这是我用来发送文件的 Ftp FtpWebR
  • 如何从另一个 SoftwareBitmap (UWP) 的区域创建 SoftwareBitmap

    创建新的最有效 最简单 的方法是什么 Windows Graphics Imaging SoftwareBitmap具有区域副本的对象 BitmapBounds例如 另一个SoftwareBitmap对象 深拷贝 适用于 Windows U
  • React useState,useEffect 中的 setState 不更新数组

    我在 SO 上看到过这个问题 但我似乎无法弄清楚它为什么存在 我正在关注来自的教程here https medium com swlh creating a simple real time chat with net core react
  • 从同名脚本导入Python包

    我正在尝试通过将脚本从包目录移动到顶级脚本目录来重新组织我的 Python 项目 经过这些更改后 我的项目层次结构如下所示 MyProject setup py scripts my package py my package init p
  • 从图像中识别数字

    我正在尝试编写一个应用程序来查找图像内的数字并将它们相加 如何识别图像中的书写数字 图像中有很多框 我需要获取左侧的数字并将它们相加得出总数 我怎样才能实现这个目标 编辑 我对图像进行了 java tesseract ocr 但没有得到任何
  • 访问 bootstrap-wysihtml5 编辑器对象

    我正在尝试访问 bootstrap wysihtml5 编辑器对象 我这样做是这样的 document ready function someLink live click function var wysihtml5Editor text
  • 修复 HTML/CSS 中元素的对齐方式

    我有以下代码 function var quotes quotes var quoteIndex 1 function showNextQuote quoteIndex quotes eq quoteIndex quotes length
  • 在 C# 中跟踪文件大小变化[重复]

    这个问题在这里已经有答案了 可能的重复 C 获取文件更改事件 https stackoverflow com questions 3948542 c sharp get file change events 我想使用 C 在达到特定大小时跟
  • 从 Python 中的 OLS 摘要获取 Durbin-Watson 和 Jarque-Bera 统计数据

    我正在运行一列值的 OLS 摘要 OLS 的一部分是 Durbin Watson 和 Jarque Bera JB 统计数据 我想直接提取这些值 因为它们已经被计算出来 而不是像我现在使用 durbinwatson 那样将这些步骤作为额外步
  • 如何将对堆栈变量的引用传递给线程?

    我正在编写一个 WebSocket 服务器 其中 Web 客户端连接以与多线程计算机 AI 下棋 WebSocket 服务器想要传递一个Logger对象到 AI 代码中 这Logger对象会将日志行从 AI 传送到 Web 客户端 这Log
  • 如何在两个表单之间传递文本框数据?

    如何通过按钮在不使用 Show ShowDialog 的情况下将文本框值发送到两个表单之间的文本框 我希望文本框无需打开表单即可获取值 要访问文本框数据 您需要使用 textBox1 Text 表单是一个对象 因此您可以定义一个更新文本框值
  • 如何在我的应用中将 Google 地图语言更改为印地语?

    我在 Android 应用程序中使用 Google 地图 我在我的应用程序中实现了语言本地化 因此 我希望每当用户更改应用程序语言时 谷歌地图语言也会更改为印地语 我尝试了以下方法来更改应用程序中 Google 地图的语言 String l
  • 在 Django 中提供 Rails-way i18n 支持的好方法

    新 Rails 中有一件事让我羡慕 国际化支持 Django 也有一项 但我更喜欢 Rails 的风格 Rails 和 Django 方法之间的主要区别在于哪种字符串的行为类似于键值转换映射中的键 即 Django 版本 键 主要 语言的字
  • 在 python 中将 Latex 代码转换为 mathml 或 svg 代码

    是否有任何 python 代码允许获取乳胶代码 用于方程 并将其解析为 mathml 或 svg 代码 一个以字符串 latex 代码 作为参数并输出字符串 svg 或 mathml 代码 的简单函数将是完美的 附言 我找到了这个http
  • Bootstrap 4 导航栏
  • 列表
  • 我需要一些有关引导导航栏的帮助 Bootstrap v4 0 0 beta 3 我必须更改什么才能使按钮文本是单行而不是彼此之间 当该行已满时 其他按钮应从下一行的左侧开始 目前我使用这段代码
  • 服务器中的 Firebase 令牌管理

    我对 firebase 和 android 通知还是很陌生 我希望能够根据某些规则向单个用户发送通知 到目前为止我读到的是可以通过以下方式生成令牌 FirebaseInstanceId getInstance getToken 然后 令牌在
  • 您可以将 CMFCVisualManager 与基于对话框的应用程序一起使用吗?

    您可以将 CMFCVisualManager 与基于对话框的应用程序一起使用来更改应用程序的外观吗 如果是这样 它是如何完成的 这个想法是使用随 MSVC 2008 发布的 MFC 功能包来更改控件 例如按钮 的形状 颜色等 不 不能这样做
  • 必须在 PIMPL 中提供析构函数

    main pimpl sample cpp include pimpl sample hpp using namespace std int main pimpl sample p return 0 pimpl sample cpp inc
  • Hololens 模拟器中的网络摄像头支持

    笔记本电脑的网络摄像头可以在最新的Hololens模拟器中使用吗 我正在关注这个教程https learn microsoft com en us windows mixed reality mr azure 302 https learn
  • Byte-Buddy:方法拦截 InvoiceHandler 与 MethodDelegation 到 GeneralInterceptor

    我使用 Byte Buddy 动态生成 Java 接口方法的实现 并将对这些方法的调用委托给现有代理对象的单个方法 第一个版本的灵感来自如何使用 ByteBuddy 创建动态代理 https stackoverflow com questi