Java ByteBuddy是否可以使用ASM实现方法
是否可以将bytebuddy的高级api和asm的低级api结合起来 我想通过bytebuddy生成一个类、它的字段、注释和一些通用方法,比如getters setters,因为它比asm容易得多 但是接下来我需要实现一个抽象类,在这里我需要使用bytebuddy似乎不支持的特性,比如条件、分支、在编译时调用另一个参数未知的方法等等 我偶然发现了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的类,但我
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);
}