From 10f6e37aa03c7e161deed055583d0c6c1430e65e Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Thu, 29 Apr 2021 23:27:17 +0800 Subject: [PATCH] Enable class cache in URLClassLoader --- .../generated/RemappingURLClassLoader.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/RemappingURLClassLoader.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/RemappingURLClassLoader.java index 77c1ca0f..860754f3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/RemappingURLClassLoader.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/RemappingURLClassLoader.java @@ -1,18 +1,21 @@ package io.izzel.arclight.common.mod.util.remapper.generated; import com.google.common.io.ByteStreams; +import io.izzel.arclight.common.asm.SwitchTableFixer; import io.izzel.arclight.common.mod.util.remapper.ArclightRemapper; import io.izzel.arclight.common.mod.util.remapper.ClassLoaderRemapper; -import io.izzel.arclight.common.mod.util.remapper.GlobalClassRepo; import io.izzel.arclight.common.mod.util.remapper.RemappingClassLoader; +import io.izzel.tools.product.Product2; import java.io.IOException; +import java.io.InputStream; import java.net.JarURLConnection; import java.net.URL; import java.net.URLClassLoader; import java.net.URLConnection; import java.net.URLStreamHandlerFactory; import java.security.CodeSource; +import java.util.concurrent.Callable; public class RemappingURLClassLoader extends URLClassLoader implements RemappingClassLoader { @@ -39,8 +42,24 @@ public class RemappingURLClassLoader extends URLClassLoader implements Remapping URL resource = this.getResource(path); if (resource != null) { try { - URLConnection connection = resource.openConnection(); - byte[] bytes = getRemapper().remapClassFile(ByteStreams.toByteArray(connection.getInputStream()), GlobalClassRepo.INSTANCE); + URLConnection connection; + Callable byteSource; + try { + connection = resource.openConnection(); + connection.connect(); + byteSource = () -> { + try (InputStream is = connection.getInputStream()) { + byte[] classBytes = ByteStreams.toByteArray(is); + classBytes = SwitchTableFixer.INSTANCE.processClass(classBytes); + return classBytes; + } + }; + } catch (IOException e) { + throw new ClassNotFoundException(name, e); + } + + Product2 classBytes = this.getRemapper().remapClass(name, byteSource, connection); + int i = name.lastIndexOf('.'); if (i != -1) { String pkgName = name.substring(0, i); @@ -52,13 +71,7 @@ public class RemappingURLClassLoader extends URLClassLoader implements Remapping } } } - CodeSource codeSource; - if (connection instanceof JarURLConnection) { - codeSource = new CodeSource(((JarURLConnection) connection).getJarFileURL(), ((JarURLConnection) connection).getJarEntry().getCodeSigners()); - } else { - codeSource = null; - } - result = this.defineClass(name, bytes, 0, bytes.length, codeSource); + result = this.defineClass(name, classBytes._1, 0, classBytes._1.length, classBytes._2); } catch (IOException e) { throw new ClassNotFoundException(name, e); }