gpt4 book ai didi

java - 创建新对象的 ByteBuddy 方法实现

转载 作者:行者123 更新时间:2023-12-02 09:01:05 26 4
gpt4 key购买 nike

我正在使用 Byte Buddy 1.9.0 作为基于 Xtext 的编程语言的代码生成器,并且我正在努力为实例化“匿名”类的方法生成字节码。出于所有意图和目的,我试图让 Byte Buddy 创建一个方法来执行与此等效的操作:

package fxxx.test;
class DummyUser
{
DummyOperator dummy()
{
return new DummyUser$1();
}
}

我的编译器已经创建了嵌套的“匿名”类 DummyUser$1 ,但是,在我的一生中,我无法想出正确的 Byte Buddy 指令序列来创建该类的新对象,然后返回该对象。经过一番搜索后,我发现了 MethodCall.construct(MethodDescription) ,但我当前的代码仅产生以下异常:

java.lang.IllegalStateException: Cannot return void from public fxxx.test.DummyOperator fxxx.test.DummyUser_.dummy()
at net.bytebuddy.implementation.MethodCall$TerminationHandler$1.resolve(MethodCall.java:2189)
at net.bytebuddy.implementation.MethodCall.toStackManipulation(MethodCall.java:2405)
at net.bytebuddy.implementation.MethodCall$Appender.apply(MethodCall.java:2434)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyCode(TypeWriter.java:698)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:683)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:590)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:5114)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1915)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:197)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:174)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3376)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:3565)
...

这个错误似乎告诉我,有点可以理解,因为该类的构造函数有一个 <init>()V签名并技术返回void这相当于返回 void来自应该真正返回 DummyOperator 的某个子类的方法的值。我尝试结合 MethodCall.constructStackManipulation复制堆栈顶部,但作为 TypeCreation通过new字节码已经被烘焙到 MethodCall.construct 中我似乎无法访问新创建的原始对象实例。该项目尚未开源,但我可以提供此代码片段(使用 Xtend 语法)来说明我的代码正在做什么:

    val Builder<?> anonymousClass = ... // the anonymous class that has already been created
val TypeDescription declaringType = describe(anonymousClass) // basically .make.typeDescription
val MethodDescription constructor = method(declaringType, new TypeDescription.ForLoadedType(void), "<init>", #[]) // new Latent declaringType/returnType
val MethodCall construct = MethodCall.construct(constructor)
// ^^^ this value gets return as the new method's Implementation

我缺少什么才能使该方法正确返回新创建的实例?

最佳答案

所以,看来我毕竟没有错过任何步骤,或者对对象实例化本身没有做任何错误。当我在调试器中运行它时,我注意到无效的堆栈操作是由类型不匹配引起的,这表明方法的返回类型实际上与匿名类的类型不兼容(我的错误;语言的类型系统比普通的 Java 稍微复杂一些,并且这两种类型以一种微妙的方式不兼容)。我想吸取的教训是,在遇到上述异常时要仔细检查类型兼容性。

关于java - 创建新对象的 ByteBuddy 方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60145096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com