显示生成的 bytebuddy 字节码
Display generated bytebuddy bytecode
我正在使用 ByteBuddy 在运行时使用动态生成的字节代码创建 class。生成的 class 完成了预期的工作,但我想手动检查生成的字节码,以确保它是正确的。
例如
Class<?> dynamicType = new ByteBuddy()
.subclass(MyAbstractClass.class)
.method(named("mymethod"))
.intercept(new MyImplementation(args))
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
其中 MyImplementation 将多个 StackManipulation 命令链接在一起以创建动态生成的代码。
我能否将生成的 class 写入文件(这样我就可以用 IDE 手动检查),或者打印出生成的 class 的字节码?
在下面找到一个示例,将生成的 class 的字节存储在字节数组中。以及如何将 class 保存到文件系统并从该数组实例化。
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();
}
}
您可以将 class 另存为 .class 文件:
new ByteBuddy()
.subclass(Object.class)
.name("Foo")
.make()
.saveIn(new File("c:/temp"));
此代码创建 c:/temp/Foo.class
.
我正在使用 ByteBuddy 在运行时使用动态生成的字节代码创建 class。生成的 class 完成了预期的工作,但我想手动检查生成的字节码,以确保它是正确的。
例如
Class<?> dynamicType = new ByteBuddy()
.subclass(MyAbstractClass.class)
.method(named("mymethod"))
.intercept(new MyImplementation(args))
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
其中 MyImplementation 将多个 StackManipulation 命令链接在一起以创建动态生成的代码。
我能否将生成的 class 写入文件(这样我就可以用 IDE 手动检查),或者打印出生成的 class 的字节码?
在下面找到一个示例,将生成的 class 的字节存储在字节数组中。以及如何将 class 保存到文件系统并从该数组实例化。
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();
}
}
您可以将 class 另存为 .class 文件:
new ByteBuddy()
.subclass(Object.class)
.name("Foo")
.make()
.saveIn(new File("c:/temp"));
此代码创建 c:/temp/Foo.class
.