ByteBuddy:新定义的字段通过反射不可见

2024-01-04

我在代理中使用 ByteBuddy 向测试程序中的每个 Runnable 添加跟踪变量:

new AgentBuilder.Default()
.with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED)
.type(ElementMatchers.isSubTypeOf(Runnable.class)
                .and(ElementMatchers.not(ElementMatchers.isInterface())))
                .and(ElementMatchers.not(ElementMatchers.isAbstract()))
            .transform((builder, typeDescription, classLoader, module) -> builder
                .defineField("foo", String.class)
                .constructor(ElementMatchers.any())
                .intercept(Advice.to(TestRunnableConstructorInterceptor.class))
                .method(ElementMatchers.named("run"))
                .intercept(Advice.to(TestRunnableRunInterceptor.class))
            )

我的拦截器类如下所示:

public static class TestRunnableConstructorInterceptor {
    @Advice.OnMethodExit
    public static void intercept(@Advice.This Object thiz, @Advice.FieldValue(value="foo",readOnly=false) String foo) throws Exception {
        foo = "baz"; // this sets the value successfully
    }
}

public static class TestRunnableRunInterceptor {
    @Advice.OnMethodEnter
    public static void intercept(@Advice.This Object thiz, @Advice.FieldValue("foo") String foo) throws Exception {
        System.out.println(foo); //prints  "baz"

        thiz.getClass().getField("foo"); // java.lang.NoSuchFieldException
    }
}

我可以看到 ByteBuddy 正在通过 FieldValue 注释传递新定义的字段,但反射地该变量不可见 - 也许是因为反射应用于原始类,而不是“重新设置”的类?

这是预期的行为吗?有没有办法通过反射访问这个新字段?

这可能与 Runnables 是 lambda 有关吗?我使用的是 Advice 而不是 MethodDelegation,因为如果我尝试在 Runnable#run 上使用 MethodDelegation,我会收到这样的错误(来自我的拦截侦听器)

Failed to transform java.util.concurrent.ThreadPoolExecutor$Worker$auxiliary$8cXEOSRS$auxiliary$7BgjnLbO (before loading) + Exception: java.lang.IllegalStateException: Cannot resolve type description for java.util.concurrent.ThreadPoolExecutor$Worker$auxiliary$8cXEOSRS Cannot resolve type description for java.util.concurrent.ThreadPoolExecutor$Worker$auxiliary$8cXEOSRSnet.bytebuddy.pool.TypePool$Resolution$Illegal.resolve(TypePool.java:134)

正如评论中提到的,您需要使用getDeclaredField方法而不是getField当您想要查找非公共字段时。

我假设你的MethodDelegation当您检测任何错误时会出现错误Runnable。你要求吗@SuperMethodCall您的委托方法中的代理?在这种情况下,您指示 Byte Buddy 也对这些类进行检测,这是不可能的,因为它们的字节代码没有持久化。

通常,Byte Buddy 会从检测中排除合成类。当您检测java.*命名空间,我假设您没有使用默认的排除匹配器?理想情况下,您应该限制仪器类型的空间,例如通过名称,您还可以排除包含以下内容的类:$auxiliary$。否则,您仍然可以像默认情况一样排除合成类。

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

ByteBuddy:新定义的字段通过反射不可见 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 用jquery拦截ajax请求显示BlockUI

    我正在尝试使用 jquery 拦截 ajax 请求 以显示等待消息 就像使用插件 BlockUI 一样 但是如何拦截由 asp net 框架提供的 UpdatePanel 发送的请求 有什么方法可以触发 Thanks 您可以使用开始请求 a
  • 未定义的索引[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我将一个文
  • 使用 Rails 4、邮件表单和 Ajax 发送电子邮件?

    我正在开发一个带有联系表单的应用程序 它是一个单页应用程序 我在后端使用 Rails 在前端使用 Angular 不适用于表单 和 Bootstrap 我正在尝试使用ajax 这样我就不必刷新页面 当我只是用rails 使用Mailform
  • neo4j cypher 将数组/列表转换为字符串

    我的图中的一种类型的边有一个称为roles 它是一个字符串数组 列表 它像是 Bill Smoke Haskell Moore Tadeusz Kesselring Nurse Noakes Boardman Mephi Old Georg
  • 对 mysql_real_escape_string 的每次调用都需要再次访问数据库吗?

    http php net manual en function mysql real escape string php http php net manual en function mysql real escape string ph
  • 如何在android xml中构建梯形形状?

    我想建立这个shape with bottom line and text在里面我有点困惑如何实现这个我累了 一些代码但没有得到所需的东西 到目前为止我已经尝试过这段代码 形状 xml
  • 以编程方式更改 Windows XP 中的默认代码页? (来自德尔福)

    谁能建议如何以编程方式更改默认的 Windows XP 代码页 我是在 Delphi 中执行此操作 这相当于进入控制面板 gt 区域设置 gt 非 Unicode 应用程序的语言 在这种情况下 我想切换到中文 中国 因此正在写入以下注册表字
  • HTML5 视频 - iPhone 上的当前时间设置不正确

    我设置了一个基本的 HTML5 视频 从中加载四个视频之一 我遇到的问题是 当我加载下一个视频时 它会从上一个时间位置继续播放 努力设定currentTime财产似乎要么是短暂的 要么是完全被忽视的 我已将侦听器添加到事件集合中 并且每个事
  • 将多个滤色器应用于同一个可绘制对象

    我想将多个滤色器串联应用到可绘制对象 那可能吗 或者也许创建一个过滤器 它是我想要应用的过滤器的组合 例如 我想要 Drawable d d setColorFilter 0x3F000000 Mode OVERLAY setColorFi
  • strlen 和 malloc:C 内存泄漏

    这个问题是无效的 我没有正确地释放学生 我会尽快接受向我透露这一点的答案 我是 C 新手 正在练习 malloc 从宏观上讲 我正在编写一个链表库 这个 create student 函数是我将用来测试我的链表库的许多函数之一 问题是 我运
  • 如何动态查看PL/SQL中变量的类型?

    此链接显示如何在 Oracle 中获取过程 函数变量的类型 查看变量的类型 https stackoverflow com questions 17134293 how to view the type of a variable in p
  • 为什么在大多数编程语言中数组索引都是从零开始的?

    C C C D Java 都是从零开始的 Matlab 是我所知道的唯一从 1 开始的语言 在 C 和 C 中 数组是从零开始的 因为它表示距项目列表开头的偏移量 这两行在 c 中具有相同的结果 anArray 3 4 anArray 3
  • NameError——当脚本分解为多个 python 文件时导入的模块

    很难找到这个问题的标题 希望这个线程不是重复的 我正在为一个项目使用 Python 2 7 使用 PyCharm 2016 2 2 编写这么长的脚本 并决定将其拆分为不同的 py 文件 然后我可以将其导入到主文件中 不幸的是 似乎在代码中较
  • 通知徽章在 Android O 中不起作用

    在 Android O 开发者预览版中 谷歌引入了通知徽章 这些徽章应该显示在启动器图标上 我正在使用来自开发通道的 Android O 模拟器 我编写了一个简单的代码来显示通知徽章 但它似乎不起作用 Notification notifi
  • C++ 文本文件读取

    所以我需要一点帮助 我目前有一个文本文件 其中包含以下数据 myfile txt b801000000 我想做的是将 b801 等数据读取为位 这样我就可以获取值 0xb8 0x01 0x00 0x00 0x00 目前我正在使用以下 typ
  • 从 pug 读取环境变量

    我正在使用 pug 编译静态 html 我自己的静态站点生成器 有点 除了 package json 文件中的这一行之外 我没有 node js 服务器代码 watch pages pug O options json w pages ou
  • 在 DaemonSet 中处理 PersistentVolumeClaim

    我有一个DaemonSet创建 flink 任务管理器 Pod 每个节点一个 Nodes 假设我有两个节点 node A node B Pods daemonSet 将创建 节点 A 上的 pod A 节点 B 上的 pod B 持久数量声
  • Access 数据库错误“找不到文件”?

    我已经使用 Access 数据库作为选择数据库很长时间了 这是我第一次遇到以下错误消息 Could not find file C Program Files Common Files Microsoft Shared DevServer
  • 在azure APIM中为同一功能应用程序创建2个不同的端点

    我有单个天蓝色功能应用程序 我想在 Azure APIM 中创建 2 个不同的 API 端点 我怎样才能做到这一点 According to some test it seems we can t implement the require
  • ByteBuddy:新定义的字段通过反射不可见

    我在代理中使用 ByteBuddy 向测试程序中的每个 Runnable 添加跟踪变量 new AgentBuilder Default with AgentBuilder LambdaInstrumentationStrategy ENA