我可以使用 Implementation.Composable#andThen() 组合具有 FixedValue 的 InvokeDynamic 吗?
Can I compose an InvokeDynamic with a FixedValue using Implementation.Composable#andThen()?
我正在 ByteBuddy 中“手动”构建一个方法。我正在构建的方法有一个 ProductType
类型的参数。假设它看起来像这样:
public ProductType frob(ProductType product) {
// stuff that I'm implementing and asking about goes here
}
在该方法中,我正在构建相当于:
product.foo(); // more on this below; foo() has a void return type, which may be important
return product; // FixedValue.argument(0)
当我像这样构建 Implementation
时,这工作正常:
MethodCall.invoke(fooMethodDescription) // invoke foo()...
.onArgument(0) // ...on product...
.andThen(FixedValue.argument(0)); // ...and then return product
(希望我没打错。)
但是,如果我像这样构建 Implementation
:
InvokeDynamic.bootstrap(...) // look up foo()'s MethodHandle via my bootstrap method...
.invoke("foo", TypeDescription.VOID) // ...invoke the method handle with a return type of void...
.withArgument(0) // ..."on" the first and only argument (product) and "with" no other arguments...
.andThen(FixedValue.argument(0)); // ...and then return product
…当然,使用正确的 InvokeDynamic
配方,结果 class 无法验证,因为 Operand stack underflow
错误 (Attempt to pop empty stack
)。
我有一个类似的 InvokeDynamic
食谱在其他很多地方使用过,所以我知道我的问题不在于 InvokeDynamic
用法。相反,它似乎与作曲有关?也许? MethodCall
和 InvokeDynamic
是否有可能表现不同,即使两者都是 Implementation
?也许 InvokeDynamic
不会将某些东西压入操作数堆栈(也许只是在 void
returns 的情况下?)而 MethodCall
呢?我在 andThen()
用法中遗漏了什么吗?
使用 ByteBuddy 1.11.2.
正如您正确指出的那样,这是 Byte Buddy 中的一个错误,现已修复。感谢那。它将与版本 1.11.3.
一起发布
我正在 ByteBuddy 中“手动”构建一个方法。我正在构建的方法有一个 ProductType
类型的参数。假设它看起来像这样:
public ProductType frob(ProductType product) {
// stuff that I'm implementing and asking about goes here
}
在该方法中,我正在构建相当于:
product.foo(); // more on this below; foo() has a void return type, which may be important
return product; // FixedValue.argument(0)
当我像这样构建 Implementation
时,这工作正常:
MethodCall.invoke(fooMethodDescription) // invoke foo()...
.onArgument(0) // ...on product...
.andThen(FixedValue.argument(0)); // ...and then return product
(希望我没打错。)
但是,如果我像这样构建 Implementation
:
InvokeDynamic.bootstrap(...) // look up foo()'s MethodHandle via my bootstrap method...
.invoke("foo", TypeDescription.VOID) // ...invoke the method handle with a return type of void...
.withArgument(0) // ..."on" the first and only argument (product) and "with" no other arguments...
.andThen(FixedValue.argument(0)); // ...and then return product
…当然,使用正确的 InvokeDynamic
配方,结果 class 无法验证,因为 Operand stack underflow
错误 (Attempt to pop empty stack
)。
我有一个类似的 InvokeDynamic
食谱在其他很多地方使用过,所以我知道我的问题不在于 InvokeDynamic
用法。相反,它似乎与作曲有关?也许? MethodCall
和 InvokeDynamic
是否有可能表现不同,即使两者都是 Implementation
?也许 InvokeDynamic
不会将某些东西压入操作数堆栈(也许只是在 void
returns 的情况下?)而 MethodCall
呢?我在 andThen()
用法中遗漏了什么吗?
使用 ByteBuddy 1.11.2.
正如您正确指出的那样,这是 Byte Buddy 中的一个错误,现已修复。感谢那。它将与版本 1.11.3.
一起发布