Optimize implementer: skip code parsing.

This commit is contained in:
IzzelAliz 2020-07-13 14:17:06 +08:00
parent 88adc18963
commit baedcf435e

View File

@ -80,17 +80,21 @@ public class InventoryImplementer implements Implementer {
private ClassNode findClass(String typeName, ILaunchPluginService.ITransformerLoader transformerLoader) throws Exception { private ClassNode findClass(String typeName, ILaunchPluginService.ITransformerLoader transformerLoader) throws Exception {
try { try {
byte[] bytes = transformerLoader.buildTransformedClassNodeFor(Type.getObjectType(typeName).getClassName());
ClassNode node = new ClassNode();
new ClassReader(bytes).accept(node, ClassReader.EXPAND_FRAMES);
return node;
} catch (ClassNotFoundException e) {
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(typeName + ".class"); InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(typeName + ".class");
if (stream == null) throw LocalizedException.checked("implementer.not-found", typeName); if (stream == null) throw LocalizedException.checked("implementer.not-found", typeName);
byte[] array = ByteStreams.toByteArray(stream); byte[] array = ByteStreams.toByteArray(stream);
ClassNode node = new ClassNode(); ClassNode node = new ClassNode();
new ClassReader(array).accept(node, ClassReader.EXPAND_FRAMES); new ClassReader(array).accept(node, ClassReader.SKIP_CODE);
return node; return node;
} catch (Throwable e) {
try {
byte[] bytes = transformerLoader.buildTransformedClassNodeFor(Type.getObjectType(typeName).getClassName());
ClassNode node = new ClassNode();
new ClassReader(bytes).accept(node, ClassReader.SKIP_CODE);
return node;
} catch (Throwable t) {
throw LocalizedException.checked("implementer.not-found", typeName);
}
} }
} }