Fix CNFE to client classes(ISTER) using reflection (#379)

This commit is contained in:
IzzelAliz 2021-12-01 17:57:46 +08:00
parent c59c507524
commit eda038a25f
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
3 changed files with 61 additions and 1 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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);