10

我正在使用 ByteBuddy 在运行时使用动态生成的字节码创建一个类。生成的类做了它打算做的事情,但我想手动检查生成的字节码,以确保它是正确的。

例如

Class<?> dynamicType = new ByteBuddy()
        .subclass(MyAbstractClass.class)
        .method(named("mymethod"))
        .intercept(new MyImplementation(args))
        .make()
        .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
        .getLoaded();

其中 MyImplementation 将多个 StackManipulation 命令链接在一起以创建动态生成的代码。

我可以将生成的类写入文件(以便我可以使用 IDE 手动检查),或者打印出生成类的字节码吗?

4

2 回答 2

14

您可以将类保存为 .class 文件:

new ByteBuddy()
    .subclass(Object.class)
    .name("Foo")
    .make()
    .saveIn(new File("c:/temp"));

此代码创建c:/temp/Foo.class.

于 2015-06-16T09:18:29.153 回答
3

在下面找到一个将生成的类的字节存储在字节数组中的示例。以及如何将类保存到文件系统并从该数组中实例化。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.instrumentation.FixedValue;
import static net.bytebuddy.instrumentation.method.matcher.MethodMatchers.named;

public class GenerateClass extends ClassLoader {

    void doStuff() throws Exception {
        byte[] classBytes = new ByteBuddy()
                .subclass(Object.class)
                .name("MyClass")
                .method(named("toString"))
                .intercept(FixedValue.value("Hello World!"))
                .make()
                .getBytes();

        // store the MyClass.class file on the file system
        Files.write(Paths.get("MyClass.class"), classBytes, StandardOpenOption.CREATE);

        // create an instance of the class from the byte array
        Class<?> defineClass = defineClass("MyClass", classBytes, 0, classBytes.length);
        System.out.println(defineClass.newInstance());
    }

    public static void main(String[] args) throws Exception {
        new GenerateClass().doStuff();
    }
}
于 2015-06-16T07:12:25.233 回答