From 9d36ad91216abeec6fdb1bec89b623509d63375c Mon Sep 17 00:00:00 2001 From: kazusa <409053122@qq.com> Date: Wed, 23 Jul 2025 15:07:35 +0800 Subject: [PATCH] bytebuddy demo --- .../pressmonster/bytebuddy/HelloWorld.java | 56 +++++++++++++++++++ .../plugins/web/RestControllerPluginTest.java | 6 +- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/bytebuddy/HelloWorld.java diff --git a/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/bytebuddy/HelloWorld.java b/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/bytebuddy/HelloWorld.java new file mode 100644 index 0000000..1a9982b --- /dev/null +++ b/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/bytebuddy/HelloWorld.java @@ -0,0 +1,56 @@ +package io.github.kazusa.pressmonster.bytebuddy; + +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.implementation.FixedValue; +import net.bytebuddy.matcher.ElementMatchers; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +/** + * @author Wen + * @date 2025/7/22 13:27 + */ +public class HelloWorld { + + @Test + public void helloWorld() throws InstantiationException, IllegalAccessException { + String helloWorld = new ByteBuddy() + // 创建一个Object子类 + .subclass(Object.class) + // 拦截toString方法 + .method(ElementMatchers.named("toString")) + // 指定了拦截到的方法要修改成什么样子 + .intercept(FixedValue.value("Hello World!")) + // 生成字节码 + .make() + // 将生成的字节码加载到JVM中 + .load(getClass().getClassLoader()) + // 获取生成的类 + .getLoaded() + .newInstance() + .toString(); + + System.out.println(helloWorld); // Hello World! + } + + @Test + public void checkClass() throws InstantiationException, IllegalAccessException, IOException { + DynamicType.Unloaded dynamicType = new ByteBuddy() + // 创建一个Object子类 + .subclass(Object.class) + .name("io.github.kazusa.pressmonster.bytebuddy.ByteBuddyHelloWorld") + // 拦截toString方法 + .method(ElementMatchers.named("toString")) + // 指定了拦截到的方法要修改成什么样子 + .intercept(FixedValue.value("Hello World!")) + // 生成字节码 + .make(); + DynamicType.Loaded load = dynamicType.load(getClass().getClassLoader()); + dynamicType.saveIn(new File(getClass().getResource("/").getPath())); + + System.out.println(load.getLoaded().newInstance()); // Hello World! + } +} diff --git a/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/plugins/web/RestControllerPluginTest.java b/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/plugins/web/RestControllerPluginTest.java index c8c2025..7acb11c 100644 --- a/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/plugins/web/RestControllerPluginTest.java +++ b/press-monster-test/plugins-tests/src/test/java/io/github/kazusa/pressmonster/plugins/web/RestControllerPluginTest.java @@ -9,7 +9,11 @@ import org.springframework.web.bind.annotation.RestController; import java.lang.reflect.Method; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * RestController插件测试