Fix CNFE to client classes(ISTER) using reflection (#379)
This commit is contained in:
parent
c59c507524
commit
eda038a25f
@ -67,6 +67,10 @@ public class ArclightRedirectAdapter implements PluginTransformer {
|
|||||||
modify(Class.class, "getDeclaredField", "classGetDeclaredField", String.class);
|
modify(Class.class, "getDeclaredField", "classGetDeclaredField", String.class);
|
||||||
modify(Class.class, "getMethod", "classGetMethod", String.class, Class[].class);
|
modify(Class.class, "getMethod", "classGetMethod", String.class, Class[].class);
|
||||||
modify(Class.class, "getDeclaredMethod", "classGetDeclaredMethod", 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(MethodType.class, "fromMethodDescriptorString", "fromDescStr", String.class, ClassLoader.class);
|
||||||
modify(MethodHandles.Lookup.class, "findStatic", "lookupFindStatic", Class.class, String.class, MethodType.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);
|
modify(MethodHandles.Lookup.class, "findVirtual", "lookupFindVirtual", Class.class, String.class, MethodType.class);
|
||||||
|
|||||||
@ -178,7 +178,7 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
|
|||||||
method.getGenericParameterTypes();
|
method.getGenericParameterTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryDefineClass(String internalName) {
|
public void tryDefineClass(String internalName) {
|
||||||
if (!internalName.startsWith(PREFIX)) {
|
if (!internalName.startsWith(PREFIX)) {
|
||||||
throw new NoClassDefFoundError(internalName);
|
throw new NoClassDefFoundError(internalName);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,6 +33,62 @@ public class ArclightReflectionHandler extends ClassLoader {
|
|||||||
|
|
||||||
public static ClassLoaderRemapper remapper;
|
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
|
// srg -> bukkit
|
||||||
public static String redirectFieldGetName(Field field) {
|
public static String redirectFieldGetName(Field field) {
|
||||||
return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName(), field);
|
return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName(), field);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user