问题标签 [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 投票
2 回答
500 浏览

java - 是否有运行时代理创建库支持保留代理类的注释?

当使用例如cglibjavassist proxies创建代理时,该代理是通过创建代理目标的子类来实现的。但是,这意味着此代理上的注释将丢失。当一个类由两个库处理时,这是有问题的,其中:

  1. 第一个库需要创建给定类的代理才能运行。
  2. 第二个库通过读取对象的注释来处理对象。

对于第二个库,同时使用第一个库时,注释已消失。问题是:是否存在具有高级 API 的运行时代码生成库,可以轻松保留代理类的注释?

0 投票
1 回答
976 浏览

java - 在 Byte Buddy 中缓存生成的类?

我一直在使用 CGLIB 的 Enhancer,但正在考虑切换到 Byte Buddy。这是非常基本的东西,可以代理多达数百个数据访问接口,按需创建。

CGLIB 正在缓存生成的类型以提高性能。Byte Buddy 的推荐方法是什么?我想避免任何 PermGen 问题。

0 投票
1 回答
2488 浏览

java - 如何在 Java 中使用 Byte Buddy 分配给字段?

我很难理解Byte Buddy的文档。为了帮助我学习 API,我想生成与这个 Java 等效的字节码:

我很难找到正确的方法Instrumentation来创建字段分配。

0 投票
1 回答
3773 浏览

java - ByteBuddy 代理接口

我正在尝试将 Cglib 代理转换为 ByteBuddy。Cglib 有net.sf.cglib.proxy.Proxy接口来拦截所有的方法调用。我检查了 ByteBuddy 的文档,但找不到这样的例子。对于我用 ByteBuddy 实例化的每个对象,如果没有这样的接口,我就会再次重复同样的事情。ByteBuddy 有没有更好的方法来做到这一点?

这是我的示例代码片段:

服务:

拦截器:

测试:

0 投票
1 回答
2832 浏览

java - 我可以使用 Byte Buddy 重新定义私有方法吗?

是否可以使用 Byte Buddy 重新定义类的私有方法?似乎使用 Byte Buddy 的切入点总是对现有类进行子类化。这样做的时候,显然不可能重新定义父类的私有方法(至少不能以在父类中使用重新定义的方法的方式)。

考虑以下示例:

输出将是“Hello World!”。有没有机会获得“字节好友!” 作为输出?

0 投票
2 回答
272 浏览

java - 为什么 Byte Buddy 缺少与操作码 ASTORE 对应的 StackManipulation 实现?

如果它的缺失是因为 byte-buddy 针对方法委托域,那么我可以提供一个需要此功能的场景:

上面的代码将为向下转换语句生成一条 ASTORE 指令。

0 投票
3 回答
1822 浏览

java - 如何为 java.nio.ByteBuffer 实例创建一个 java 代理对象?

我有一个公共抽象类java.nio.ByteBuffer实例,它实际上是私有类的一个实例,java.nio.HeapByteBuffer我需要创建一个代理对象,它会调用一些调用方法处理程序来检查访问权限,然后在实际实例上调用调用的方法。

问题是java.nio.ByteBuffer该类只有私有构造函数并且还有一些最终方法,因此我无法使用javassist.util.proxy.ProxyFactory类创建代理实例。

那么,如何创建代理对象来控制java.nio.ByteBuffer实例的调用,包括那些最终方法的调用?

0 投票
1 回答
3443 浏览

java - Java Bytecode:使用字节伙伴定制的 setter/getter

我正在尝试为具有字节伙伴的字段创建“自定义”设置方法。Buddy 自己的机制允许非常容易地实现标准的 setter/getter 方法,但是,我正在寻找一种优雅的方法来使用一些额外的逻辑来扩展 setter。

为了简化示例,假设我们有一个类 A,它有一个方法 setChanged(String)。目标是做一个A的子类,添加一个具有相应访问方法的字段。问题是,我想从每个添加的 setter 方法中调用 setChanged("fieldName") 。

对于“正常”的 setter 方法,字节 byddy 实现将是:

我追求的字节码如下所示:

我的问题是:有没有办法在这种情况下重用 FieldAccessor ?

0 投票
1 回答
1040 浏览

java - Byte Buddy 可以访问方法的局部变量名吗?

假设我有一个方法m

我想使用 ByteBuddy 来检测代码,以便在调用doSomethingm,它会自动将 和 的值foo放入baraHashMap中,几乎看起来像:

无论如何可以通过 ByteBuddy 进行此检测吗?

0 投票
2 回答
569 浏览

java - 字节好友导致 IncompatibleClassChangeError

我使用 Byte Buddy (v0.5.2) 动态创建接口的“子类”(实际上,我想创建一个实现该接口的类)。在此类的实例上调用的所有方法都应重定向到另一个(拦截器)类。我使用了以下代码(“TestInterface”是一个接口,它声明了一个方法“sayHello”):

拦截器类如下所示:

但是,当我尝试调用“sayHello”方法(我的代码示例的最后一行)时,我得到一个“IncompatibleClassChangeError”。堆栈跟踪如下:

该问题似乎与我的拦截器方法中使用“MethodHandle”参数有关。当我将类型更改为“方法”时,一切正常。但是根据文档,由于性能原因,应该首选“MethodHandle”而不是“Method”。

错误是由 Byte Buddy 中的错误引起的,还是在这种情况下我实际上应该使用“方法”参数?