diff --git a/generator/src/main/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptor.java b/generator/src/main/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptor.java
index 8c0097a9..2eceb3a4 100644
--- a/generator/src/main/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptor.java
+++ b/generator/src/main/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptor.java
@@ -7,7 +7,6 @@ import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.implementation.MethodCall;
-import net.bytebuddy.implementation.bytecode.assign.Assigner;
import java.lang.reflect.Field;
@@ -20,8 +19,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
* @author ReaJason
*/
public class ByPassJdkModuleInterceptor {
- @Advice.OnMethodExit
- public static void enter(@Advice.Origin Class> clazz, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) boolean returnValue) {
+ @Advice.OnMethodEnter
+ public static void enter(@Advice.Origin Class> clazz) {
try {
Class> unsafeClass = Class.forName("sun.misc.Unsafe");
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
@@ -32,7 +31,6 @@ public class ByPassJdkModuleInterceptor {
Long offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
java.lang.reflect.Method getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
getAndSetObjectM.invoke(unsafe, clazz, offset, module);
- returnValue = true;
} catch (Exception ignored) {
}
}
@@ -41,7 +39,7 @@ public class ByPassJdkModuleInterceptor {
* Reference1: stackoverflow
* Reference2: issue
*
- * 向类中添加 byPassJdkModule 方法,并在创建静态变量初始化,使其能在静态代码块中执行 byPassJdkModule 方法
+ * 向类中添加 byPassJdkModule 方法,并在静态代码块中执行 byPassJdkModule 方法
* 值得注意的一点,builder 是不可变类型,所以都是需要重新赋值,例如以下代码示例
* # code that not work
* builder = new Bytebuddy().redefine(class);
@@ -59,13 +57,12 @@ public class ByPassJdkModuleInterceptor {
*/
public static DynamicType.Builder> extend(DynamicType.Builder> builder) {
return builder
- .defineField("isBypassModule", boolean.class, Visibility.PUBLIC, Ownership.STATIC)
- .invokable(isTypeInitializer())
- .intercept(MethodCall.invoke(named("byPassJdkModule")))
- .defineMethod("byPassJdkModule", Object.class, Visibility.PUBLIC, Ownership.STATIC)
- .intercept(FixedValue.value(false))
+ .defineMethod("byPassJdkModule", void.class, Visibility.PUBLIC, Ownership.STATIC)
+ .intercept(FixedValue.originType())
.visit(new AsmVisitorWrapper.ForDeclaredMethods()
.method(named("byPassJdkModule"),
- Advice.to(ByPassJdkModuleInterceptor.class)));
+ Advice.to(ByPassJdkModuleInterceptor.class)))
+ .invokable(isTypeInitializer())
+ .intercept(MethodCall.invoke(named("byPassJdkModule")));
}
}
\ No newline at end of file
diff --git a/generator/src/test/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptorTest.java b/generator/src/test/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptorTest.java
new file mode 100644
index 00000000..fa4dd51b
--- /dev/null
+++ b/generator/src/test/java/com/reajason/javaweb/buddy/ByPassJdkModuleInterceptorTest.java
@@ -0,0 +1,44 @@
+package com.reajason.javaweb.buddy;
+
+import lombok.SneakyThrows;
+import net.bytebuddy.ByteBuddy;
+import net.bytebuddy.dynamic.DynamicType;
+import org.junit.jupiter.api.Test;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * @author ReaJason
+ * @since 2024/12/7
+ */
+class ByPassJdkModuleInterceptorTest {
+
+ static class TestClass {
+ static {
+ System.out.println("TestClass");
+ }
+
+ public TestClass() {
+ }
+
+
+ public String hello() {
+ return "hello";
+ }
+ }
+
+ @Test
+ @SneakyThrows
+ void test() {
+ DynamicType.Builder> builder = new ByteBuddy()
+ .redefine(TestClass.class)
+ .name("com.reajason.javaweb.buddy.ByPassJdkModuleInterceptorTest$TestClass1");
+ builder = ByPassJdkModuleInterceptor.extend(builder);
+ try (DynamicType.Unloaded> make = builder.make()) {
+ byte[] bytes = make.getBytes();
+ Files.write(Paths.get("build", "classes", "TestClass1.class"), bytes);
+ }
+ }
+
+}
\ No newline at end of file