问题标签 [byte-buddy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
713 浏览

java - 使用 byte-buddy 子类化抽象参数化类

我从非常令人印象深刻的字节码操作库 byte-buddy 开始。它工作正常,但我对抽象的参数化类进行子类化时遇到问题:

这是抽象类:

我想创建一个具体的类扩展

我想创建一个具体的AbstractTask, 类来满足以下断言:

createConcreteImplementation方法通过 Byte Buddy 创建一个子类。即使这是不可能的,我也欢迎提供替代方法或近似此行为的建议。

0 投票
1 回答
2150 浏览

java - 如何使用 Byte Buddy 创建默认构造函数

我想拦截我的一个类上的一些方法调用,但这些类没有默认构造函数。

给定以下类,我将如何设置 Byte Buddy 来创建一个公共的无参数构造函数来创建生成的类?

编辑:具体用例是简化单元测试设置。
目前我们总是要写这样的东西:

我认为在 @Before 方法中创建一个代理会很好,它会自动为您设置上下文。

我玩了一下,但不幸的是我没有让它工作..

不幸的是,现在我得到了(可能是因为 ctor 调用仍未正确设置)

这甚至是正确的方法吗?
我应该在这里使用字节伙伴还是有更简单/其他的方式?

0 投票
2 回答
1196 浏览

java - ByteBuddy 没有重新定义静态方法

我正在尝试使用 ByteBuddy 重新定义 2 种方法,如下所示:

对 CppBlockInterceptor 的直接调用会产生预期的输出,但对应该被替换的方法的调用仍然使用旧行为。这有什么原因吗?

0 投票
2 回答
422 浏览

java - 委托给抽象基类的设置器会导致加载时出现验证错误

这个问题与我之前的问题有关:How to create a default constructor with Byte Buddy

我正在创建一个子类,它首先在对某个实例进行委托方法调用之前设置一些上下文。这已经很好地解决了一个问题。

加载动态创建的子类时出现以下错误。

这是目前我的字节伙伴设置,它适用于几乎所有情况,除了导致显示错误 的“ setTimeoutManager”和“ ”方法。setState

我需要为二传手设置不同的设置吗?
还是由抽象类引起的?
我真的不明白为什么它说对受保护数据的访问不正确,这是否意味着私有字段?

我的类型层次结构看起来像这样。声明设置器的最顶层基类:

扩展:

最后再次扩展:

我希望代码可以理解,如果需要,我可以随时添加更多信息。

0 投票
2 回答
422 浏览

java - 字节伙伴示例中的“getClass()”

我从 Byte Buddy 站点获取以下示例代码并将其粘贴到 Eclipse 中:

getClass()语法检查器出错并显示以下消息:

无法从 Object 类型对非静态方法 getClass() 进行静态引用。

我该如何解决这个问题?

0 投票
2 回答
654 浏览

java - Bytebuddy - 在运行时重新定义类

你能告诉我字节伙伴是否可能出现这种情况:

  1. Java 程序正在运行。
  2. 加载了具有大量属性的标准 java POJO 类。
  3. ByteBuddy - 在运行时修改每个类替换属性类型,例如 int 和 Integer MyIntegerMyInteger是否可以拦截此属性的设置。我不想使用设置器,因为并非必须为所有属性设置设置器。
  4. 每次调用都SomeClass.setSomeInt(1)将调用在 MyInteger 上定义的某些方法。
  5. 将所有属性删除回原来的MyInteger->intMyInteger-> Integer

基本上直接在属性上运行时代理。

0 投票
2 回答
583 浏览

java - ByteBuddy 没有找到一些方法

我创建了以下代理,它应该使用 ByteBuddy 示例LogInterceptor(仅打印被调用方法的名称)重新定义每个类并转换每个方法:

完成此操作后,我继续调用我的代码,例如:

...初始化 JavaFX。但是,我没有看到我的拦截器在 JavaFX 中打印任何方法。但更糟糕的是,我也没有看到 ByteBuddy 在我的一些类上打印任何方法,尽管它在其中一些类中是完全随机的(或者看起来如此)。

我的代理不应该为每个类捕获每个方法吗?这显然不是我想要做的,而是作为一种调试方式,为什么我感兴趣的方法没有被检测。

0 投票
2 回答
722 浏览

java - 创建 jdbc 连接的动态代理以覆盖提交或回滚方法

我正在开发一个广泛使用旧式 jdbc SQL 操作(即 SELECT、UPDATE、INSERT 等)的现有应用程序。

该应用程序有一个管理数据字段的类,带有一个脏标志以指示某些内容已更改并且需要提交到数据库。

当 INSERT 或 UPDATE 语句无异常完成并且提交成功时,需要关闭“脏标志”。

由于当前的设计和程序流程的原因,这并不是完全无关紧要的,所以,我认为可以实现一个用于将更改写入数据库的 Connection 的代理,覆盖 commit 方法并确保当 commit成功,标志设置为关闭。

换句话说,我想实际上实现一个基于 java 的数据库提交“回调”,以便我可以订阅特定连接的提交,并对这些事件采取行动。

我正在研究 byte-buddy 作为实现这一目标的一种可能方式,但在我迄今为止看到的所有示例中,都可以控制正在修改的类的实例化。

我的情况并非如此。实现 java.sql.Connection 的类型的实例由 jdbc 驱动程序创建,通常由数据库连接池(例如 TomCat 连接池)中使用的另一个类包装。

如何拦截这些对象的实例化,并动态覆盖提交和回滚方法?

我可以用字节伙伴来做吗?

有更好的选择吗?

0 投票
1 回答
1139 浏览

java - 使用 Byte Buddy 将 DTO 转换为实体的注释

我有一个简单的实体用户。

和他对应的DTO

我想实现如下所示的目标,以避免使用多类变压器。

使用这个示例类,我可以做到:

但这会很昂贵,因为在每个转换中都会消耗注释。

Byte-buddy 可以读取注释并创建一个类转换器,其反编译代码如下所示:

更新: @Rafael Winterhalter,是这样的吗?

0 投票
1 回答
725 浏览

java - ByteBuddy and annotations

I have a bunch of WebServices running on plain JDK and I need to intercept all public methods in order to do something. Some methods are using @WebParam annotation. Subclassing the WebService with ByteBuddy drops the @WebParam annotation from the overriding method and the service doesn't work anymore as expected.

Here's a sample signature

And here's how I'm using ByteBuddy

I know there's a way to annotate parameters, but it requires special knowledge about the method parameters (because only some params are annotated). What I'd would like to do is just to ask ByteBuddy to annotate my class exactly the same way as superclass including all parameters of all overridden methods.

Any ideas?

BR, Paci