如果我有一个 JavaConstant.MethodHandle 并且我想以某种方式将它传递给 MethodCall.invoke() 有没有办法做到这一点?
If I have a JavaConstant.MethodHandle and I want to somehow pass it to MethodCall.invoke() is there a way to do it?
假设我正在使用 ByteBuddy 生成 class。
进一步假设我有一个 JavaConstant.MethodHandle
是我以某种方式制作的。
假设现在我想使用 JavaConstant.MethodHandle
作为 MethodCall.invoke()
的名义参数作为我 class 一代的一部分。 显然目前我不能这样做,因为 MethodCall.invoke
充其量只需要一个 MethodDescription
。但要点是:(a) 我发现这个 MethodHandle
,(b) MethodHandle
实例可以存储在常量池中,所以{疯狂挥手} (c) ByteBuddy 很神奇,我可以通过说 MethodCall.invoke(myMethodHandleConstantGoesHere)
.
实现生成的方法
所以:谈论对 MethodCall.invoke()
的增强是否合理(或者是否荒谬),以至于它可以采取 JavaConstant.MethodHandle
并做从常量池中解析它的魔法?
一些其他有趣的背景信息:
- ByteBuddy 说“Note that constant MethodHandles cannot be represented within the constant pool of a Java class", which I think is not true for modern JVMs。(我知道 ByteBuddy 必须支持 JVM 回到 1.5。)
- usage page for
JavaConstant.MethodHandle
indicates that it is not really used outside of ByteBuddy's AgentBuilder.LambdaInstrumentationStrategy.LambdaInstanceFactory.LambdaMethodImplementation
class。它是在现代 JVM 的常量池中表示 MethodHandle
的可行结构吗?
这是不可能的,但在您的 PR 之后,它将出现在下一个版本中。从 Byte Buddy 1.10.18 开始将成为可能。
假设我正在使用 ByteBuddy 生成 class。
进一步假设我有一个 JavaConstant.MethodHandle
是我以某种方式制作的。
假设现在我想使用 JavaConstant.MethodHandle
作为 MethodCall.invoke()
的名义参数作为我 class 一代的一部分。 显然目前我不能这样做,因为 MethodCall.invoke
充其量只需要一个 MethodDescription
。但要点是:(a) 我发现这个 MethodHandle
,(b) MethodHandle
实例可以存储在常量池中,所以{疯狂挥手} (c) ByteBuddy 很神奇,我可以通过说 MethodCall.invoke(myMethodHandleConstantGoesHere)
.
所以:谈论对 MethodCall.invoke()
的增强是否合理(或者是否荒谬),以至于它可以采取 JavaConstant.MethodHandle
并做从常量池中解析它的魔法?
一些其他有趣的背景信息:
- ByteBuddy 说“Note that constant MethodHandles cannot be represented within the constant pool of a Java class", which I think is not true for modern JVMs。(我知道 ByteBuddy 必须支持 JVM 回到 1.5。)
- usage page for
JavaConstant.MethodHandle
indicates that it is not really used outside of ByteBuddy'sAgentBuilder.LambdaInstrumentationStrategy.LambdaInstanceFactory.LambdaMethodImplementation
class。它是在现代 JVM 的常量池中表示MethodHandle
的可行结构吗?
这是不可能的,但在您的 PR 之后,它将出现在下一个版本中。从 Byte Buddy 1.10.18 开始将成为可能。