Java ByteBuddy是否可以使用ASM实现方法

Java ByteBuddy是否可以使用ASM实现方法,java,java-bytecode-asm,byte-buddy,Java,Java Bytecode Asm,Byte Buddy,是否可以将bytebuddy的高级api和asm的低级api结合起来 我想通过bytebuddy生成一个类、它的字段、注释和一些通用方法,比如getters setters,因为它比asm容易得多 但是接下来我需要实现一个抽象类,在这里我需要使用bytebuddy似乎不支持的特性,比如条件、分支、在编译时调用另一个参数未知的方法等等 我偶然发现了net.bytebuddy.implementation.bytecode.ByteCodeAppender一个公开MethodVisitor的类,但我

是否可以将bytebuddy的高级api和asm的低级api结合起来

我想通过bytebuddy生成一个类、它的字段、注释和一些通用方法,比如getters setters,因为它比asm容易得多

但是接下来我需要实现一个抽象类,在这里我需要使用bytebuddy似乎不支持的特性,比如条件、分支、在编译时调用另一个参数未知的方法等等

我偶然发现了
net.bytebuddy.implementation.bytecode.ByteCodeAppender
一个公开MethodVisitor的类,但我找不到任何正确使用它的示例

new ByteBuddy()
                .subclass(Base.class)
                .name(className)
                 ... define fields ...
                .defineMethod("testFor", Result.class, Ownership.MEMBER, Visibility.PUBLIC) //testFor is an abstract method on superclass that i inherit from  - public abstract Result testFor(Context c, WEnvironment env)
                .withParameters(Context.class, WEnvironment.class)
                .intercept(MethodDelegation.to(new ByteCodeAppenderImpl(...some ctr args...)));

class ByteCodeAppenderImpl implements ByteCodeAppender {

    <...ctr...>

 @Override
 public Size apply(MethodVisitor mv, Implementation.Context implContext, MethodDescription insnMethod) {

            mv.visitCode();
            mv.visitVarInsn(...);
            mv.visitFieldInsn(..)
            //Here i do required asm calls to implement the method
            .... 
            StackManipulation.Size operandStackSize = new StackManipulation.Compound().apply(methodVisitor, implementationContext);
            return new Size(operandStackSize.getMaximalSize(), instrumentedMethod.getStackSize());

}

我从中继承的Base.class及其要实现的方法

public abstract class Base<T extends WEnvironment> extends ContextTest {

    public abstract Result testFor(Context c, T t);
}
公共抽象类基扩展了ContextTest{
公共抽象结果testFor(上下文c,T);
}

您的方法是正确的,但是您需要使用
实现来提供
字节码附加器。使用
MethodDelegation
尝试对对象进行委托,但提供的对象没有任何意义,因为它们没有意义的委托目标异常试图告诉您的是什么。您可以使用
新实现简单地包装追加器。如果不进行任何特定调整,则简单(…)

我可以让参考底图类/方法编写器自动计算堆栈帧大小吗?对于纯asm,这意味着将ClassWriter.COMPUTE\u frames的值传递到ClassWriter构造函数中,您可以注册一个
ClassVisitorWrapper
,并将标志传递给asm。
public abstract class Base<T extends WEnvironment> extends ContextTest {

    public abstract Result testFor(Context c, T t);
}