From eda038a25f0755034ae2e2d5a6ca9fc07270719b Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 1 Dec 2021 17:57:46 +0800 Subject: [PATCH] Fix CNFE to client classes(ISTER) using reflection (#379) --- .../remapper/ArclightRedirectAdapter.java | 4 ++ .../util/remapper/ClassLoaderRemapper.java | 2 +- .../generated/ArclightReflectionHandler.java | 56 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) 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 867c94cc..4e3a2a82 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 @@ -67,6 +67,10 @@ public class ArclightRedirectAdapter implements PluginTransformer { modify(Class.class, "getDeclaredField", "classGetDeclaredField", String.class); modify(Class.class, "getMethod", "classGetMethod", String.class, Class[].class); modify(Class.class, "getDeclaredMethod", "classGetDeclaredMethod", String.class, Class[].class); + redirect(Class.class, "getDeclaredMethods", "getDeclaredMethods"); + redirect(Class.class, "getMethods", "getMethods"); + redirect(Class.class, "getDeclaredFields", "getDeclaredFields"); + redirect(Class.class, "getFields", "getFields"); modify(MethodType.class, "fromMethodDescriptorString", "fromDescStr", String.class, ClassLoader.class); modify(MethodHandles.Lookup.class, "findStatic", "lookupFindStatic", Class.class, String.class, MethodType.class); modify(MethodHandles.Lookup.class, "findVirtual", "lookupFindVirtual", Class.class, String.class, MethodType.class); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java index 23b1ee22..3a365f70 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java @@ -178,7 +178,7 @@ public class ClassLoaderRemapper extends LenientJarRemapper { method.getGenericParameterTypes(); } - private void tryDefineClass(String internalName) { + public void tryDefineClass(String internalName) { if (!internalName.startsWith(PREFIX)) { throw new NoClassDefFoundError(internalName); } 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 0cc1977f..8bec98b0 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 @@ -33,6 +33,62 @@ public class ArclightReflectionHandler extends ClassLoader { public static ClassLoaderRemapper remapper; + public static Method[] redirectGetDeclaredMethods(Class cl) { + try { + return cl.getDeclaredMethods(); + } catch (TypeNotPresentException e) { + if (e.getCause() instanceof ClassNotFoundException) { + remapper.tryDefineClass(e.getCause().getMessage().replace('.', '/')); + return redirectGetDeclaredMethods(cl); + } else throw e; + } catch (NoClassDefFoundError error) { + remapper.tryDefineClass(error.getMessage()); + return redirectGetDeclaredMethods(cl); + } + } + + public static Method[] redirectGetMethods(Class cl) { + try { + return cl.getMethods(); + } catch (TypeNotPresentException e) { + if (e.getCause() instanceof ClassNotFoundException) { + remapper.tryDefineClass(e.getCause().getMessage().replace('.', '/')); + return redirectGetMethods(cl); + } else throw e; + } catch (NoClassDefFoundError error) { + remapper.tryDefineClass(error.getMessage()); + return redirectGetMethods(cl); + } + } + + public static Field[] redirectGetDeclaredFields(Class cl) { + try { + return cl.getDeclaredFields(); + } catch (TypeNotPresentException e) { + if (e.getCause() instanceof ClassNotFoundException) { + remapper.tryDefineClass(e.getCause().getMessage().replace('.', '/')); + return redirectGetDeclaredFields(cl); + } else throw e; + } catch (NoClassDefFoundError error) { + remapper.tryDefineClass(error.getMessage()); + return redirectGetDeclaredFields(cl); + } + } + + public static Field[] redirectGetFields(Class cl) { + try { + return cl.getFields(); + } catch (TypeNotPresentException e) { + if (e.getCause() instanceof ClassNotFoundException) { + remapper.tryDefineClass(e.getCause().getMessage().replace('.', '/')); + return redirectGetFields(cl); + } else throw e; + } catch (NoClassDefFoundError error) { + remapper.tryDefineClass(error.getMessage()); + return redirectGetFields(cl); + } + } + // srg -> bukkit public static String redirectFieldGetName(Field field) { return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName(), field);