问题标签 [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.
java - 是否有运行时代理创建库支持保留代理类的注释?
当使用例如cglib或javassist proxies创建代理时,该代理是通过创建代理目标的子类来实现的。但是,这意味着此代理上的注释将丢失。当一个类由两个库处理时,这是有问题的,其中:
- 第一个库需要创建给定类的代理才能运行。
- 第二个库通过读取对象的注释来处理对象。
对于第二个库,同时使用第一个库时,注释已消失。问题是:是否存在具有高级 API 的运行时代码生成库,可以轻松保留代理类的注释?
java - 在 Byte Buddy 中缓存生成的类?
我一直在使用 CGLIB 的 Enhancer,但正在考虑切换到 Byte Buddy。这是非常基本的东西,可以代理多达数百个数据访问接口,按需创建。
CGLIB 正在缓存生成的类型以提高性能。Byte Buddy 的推荐方法是什么?我想避免任何 PermGen 问题。
java - 如何在 Java 中使用 Byte Buddy 分配给字段?
我很难理解Byte Buddy的文档。为了帮助我学习 API,我想生成与这个 Java 等效的字节码:
我很难找到正确的方法Instrumentation
来创建字段分配。
java - ByteBuddy 代理接口
我正在尝试将 Cglib 代理转换为 ByteBuddy。Cglib 有net.sf.cglib.proxy.Proxy接口来拦截所有的方法调用。我检查了 ByteBuddy 的文档,但找不到这样的例子。对于我用 ByteBuddy 实例化的每个对象,如果没有这样的接口,我就会再次重复同样的事情。ByteBuddy 有没有更好的方法来做到这一点?
这是我的示例代码片段:
服务:
拦截器:
测试:
java - 我可以使用 Byte Buddy 重新定义私有方法吗?
是否可以使用 Byte Buddy 重新定义类的私有方法?似乎使用 Byte Buddy 的切入点总是对现有类进行子类化。这样做的时候,显然不可能重新定义父类的私有方法(至少不能以在父类中使用重新定义的方法的方式)。
考虑以下示例:
输出将是“Hello World!”。有没有机会获得“字节好友!” 作为输出?
java - 为什么 Byte Buddy 缺少与操作码 ASTORE 对应的 StackManipulation 实现?
如果它的缺失是因为 byte-buddy 针对方法委托域,那么我可以提供一个需要此功能的场景:
上面的代码将为向下转换语句生成一条 ASTORE 指令。
java - 如何为 java.nio.ByteBuffer 实例创建一个 java 代理对象?
我有一个公共抽象类java.nio.ByteBuffer
实例,它实际上是私有类的一个实例,java.nio.HeapByteBuffer
我需要创建一个代理对象,它会调用一些调用方法处理程序来检查访问权限,然后在实际实例上调用调用的方法。
问题是java.nio.ByteBuffer
该类只有私有构造函数并且还有一些最终方法,因此我无法使用javassist.util.proxy.ProxyFactory
类创建代理实例。
那么,如何创建代理对象来控制java.nio.ByteBuffer
实例的调用,包括那些最终方法的调用?
java - Java Bytecode:使用字节伙伴定制的 setter/getter
我正在尝试为具有字节伙伴的字段创建“自定义”设置方法。Buddy 自己的机制允许非常容易地实现标准的 setter/getter 方法,但是,我正在寻找一种优雅的方法来使用一些额外的逻辑来扩展 setter。
为了简化示例,假设我们有一个类 A,它有一个方法 setChanged(String)。目标是做一个A的子类,添加一个具有相应访问方法的字段。问题是,我想从每个添加的 setter 方法中调用 setChanged("fieldName") 。
对于“正常”的 setter 方法,字节 byddy 实现将是:
我追求的字节码如下所示:
我的问题是:有没有办法在这种情况下重用 FieldAccessor ?
java - Byte Buddy 可以访问方法的局部变量名吗?
假设我有一个方法m
:
我想使用 ByteBuddy 来检测代码,以便在调用doSomething
时m
,它会自动将 和 的值foo
放入bar
aHashMap
中,几乎看起来像:
无论如何可以通过 ByteBuddy 进行此检测吗?
java - 字节好友导致 IncompatibleClassChangeError
我使用 Byte Buddy (v0.5.2) 动态创建接口的“子类”(实际上,我想创建一个实现该接口的类)。在此类的实例上调用的所有方法都应重定向到另一个(拦截器)类。我使用了以下代码(“TestInterface”是一个接口,它声明了一个方法“sayHello”):
拦截器类如下所示:
但是,当我尝试调用“sayHello”方法(我的代码示例的最后一行)时,我得到一个“IncompatibleClassChangeError”。堆栈跟踪如下:
该问题似乎与我的拦截器方法中使用“MethodHandle”参数有关。当我将类型更改为“方法”时,一切正常。但是根据文档,由于性能原因,应该首选“MethodHandle”而不是“Method”。
错误是由 Byte Buddy 中的错误引起的,还是在这种情况下我实际上应该使用“方法”参数?