From f2b24ca9f0f4ad327b57bee3a26f0f11d1c73d8f Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sun, 27 Jun 2021 14:29:12 +0800 Subject: [PATCH] Add MH.defineClass into redirect handler --- .../mod/util/remapper/ArclightRedirectAdapter.java | 1 + .../remapper/generated/ArclightReflectionHandler.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java index c6227745..1d139537 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRedirectAdapter.java @@ -91,6 +91,7 @@ public class ArclightRedirectAdapter implements PluginTransformer { modify(classOf("sun.misc.Unsafe"), "defineClass", "unsafeDefineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); modify(classOf("jdk.internal.misc.Unsafe"), "defineClass", "unsafeDefineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); modify(classOf("jdk.internal.misc.Unsafe"), "defineClass0", "unsafeDefineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class); + modify(MethodHandles.Lookup.class, "defineClass", "lookupDefineClass", byte[].class); } public static Object[] runHandle(ClassLoaderRemapper remapper, Method method, Object src, Object[] param) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java index ce5ea1b5..8add9b4d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java @@ -461,6 +461,16 @@ public class ArclightReflectionHandler extends ClassLoader { return redirectDefineClass(loader, name, bytes, off, len, pd); } + public static Object[] handleLookupDefineClass(MethodHandles.Lookup lookup, byte[] bytes) { + return new Object[]{lookup, transformOrAdd(lookup.lookupClass().getClassLoader(), bytes)}; + } + + public static Class redirectLookupDefineClass(MethodHandles.Lookup lookup, byte[] bytes) throws Throwable { + byte[] transform = transformOrAdd(lookup.lookupClass().getClassLoader(), bytes); + MethodHandle mh = Unsafe.lookup().findVirtual(MethodHandles.Lookup.class, "defineClass", MethodType.methodType(Class.class, byte[].class)); + return (Class) mh.invokeExact(lookup, transform); + } + public static byte[] transformOrAdd(ClassLoader loader, byte[] bytes) { RemappingClassLoader rcl = null; while (loader != null) {