From 4c9fb78cb06fff1439827bcc2f66e8a1433d1573 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 28 May 2019 13:22:59 +0200 Subject: [PATCH] Avoid opening InputStream via URL when calling super.getResourceAsStream When bootstrap resources are supported delegating to super.getResourceAsStream() will cause opening InputStreams from URL. This isn't as efficient as own UrlClassLoader's capability to use existing open ZipFile handles GitOrigin-RevId: 48fa777911b29196899275119c6ccabbebca9afc --- .../src/com/intellij/util/lang/UrlClassLoader.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/platform/util-class-loader/src/com/intellij/util/lang/UrlClassLoader.java b/platform/util-class-loader/src/com/intellij/util/lang/UrlClassLoader.java index e5f7402f9ac7..b120e9c6cdfc 100644 --- a/platform/util-class-loader/src/com/intellij/util/lang/UrlClassLoader.java +++ b/platform/util-class-loader/src/com/intellij/util/lang/UrlClassLoader.java @@ -63,7 +63,6 @@ public class UrlClassLoader extends ClassLoader { @SuppressWarnings("unused") void appendToClassPathForInstrumentation(String jar) { try { - //noinspection deprecation addURL(new File(jar).toURI().toURL()); } catch(MalformedURLException ignore) {} } @@ -345,8 +344,11 @@ public class UrlClassLoader extends ClassLoader { return defineClass(name, b, 0, b.length, protectionDomain); } + private static final ThreadLocal ourSkipFindingResource = new ThreadLocal(); + @Override public URL findResource(String name) { + if (ourSkipFindingResource.get() != null) return null; Resource res = findResourceImpl(name); return res != null ? res.getURL() : null; } @@ -365,7 +367,13 @@ public class UrlClassLoader extends ClassLoader { @Override public InputStream getResourceAsStream(String name) { if (myAllowBootstrapResources) { - return super.getResourceAsStream(name); + ourSkipFindingResource.set(Boolean.TRUE); + try { + InputStream stream = super.getResourceAsStream(name); + if (stream != null) return stream; + } finally { + ourSkipFindingResource.set(null); + } } try { Resource res = findResourceImpl(name);