diff options
author | Philippe Charles <charphi@users.noreply.github.com> | 2018-08-22 09:54:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-22 09:54:00 +0200 |
commit | 3ffac6642456e2c7d32952c62df8a565e2d4728b (patch) | |
tree | b0a28ac208dcb8af9add494c4caffe4f11bb287b /src/launch | |
parent | 35c7c6bda2e71da2e6e06cec5b0fb012c348f694 (diff) | |
parent | 769185e123dfd4a073161eafb58ce50bb79d6201 (diff) | |
download | lombok-3ffac6642456e2c7d32952c62df8a565e2d4728b.tar.gz lombok-3ffac6642456e2c7d32952c62df8a565e2d4728b.tar.bz2 lombok-3ffac6642456e2c7d32952c62df8a565e2d4728b.zip |
Merge branch 'master' into master
Diffstat (limited to 'src/launch')
-rw-r--r-- | src/launch/lombok/launch/Agent.java | 2 | ||||
-rw-r--r-- | src/launch/lombok/launch/AnnotationProcessor.java | 2 | ||||
-rw-r--r-- | src/launch/lombok/launch/Main.java | 12 | ||||
-rw-r--r-- | src/launch/lombok/launch/ShadowClassLoader.java | 37 |
4 files changed, 32 insertions, 21 deletions
diff --git a/src/launch/lombok/launch/Agent.java b/src/launch/lombok/launch/Agent.java index 7989e51f..357a8e48 100644 --- a/src/launch/lombok/launch/Agent.java +++ b/src/launch/lombok/launch/Agent.java @@ -35,7 +35,7 @@ final class Agent { } private static void runLauncher(String agentArgs, Instrumentation instrumentation, boolean injected) throws Throwable { - ClassLoader cl = Main.createShadowClassLoader(); + ClassLoader cl = Main.getShadowClassLoader(); try { Class<?> c = cl.loadClass("lombok.core.AgentLauncher"); Method m = c.getDeclaredMethod("runAgents", String.class, Instrumentation.class, boolean.class, Class.class); diff --git a/src/launch/lombok/launch/AnnotationProcessor.java b/src/launch/lombok/launch/AnnotationProcessor.java index c4f922b9..b03dec76 100644 --- a/src/launch/lombok/launch/AnnotationProcessor.java +++ b/src/launch/lombok/launch/AnnotationProcessor.java @@ -104,7 +104,7 @@ class AnnotationProcessorHider { } private static AbstractProcessor createWrappedInstance() { - ClassLoader cl = Main.createShadowClassLoader(); + ClassLoader cl = Main.getShadowClassLoader(); try { Class<?> mc = cl.loadClass("lombok.core.AnnotationProcessor"); return (AbstractProcessor) mc.getDeclaredConstructor().newInstance(); diff --git a/src/launch/lombok/launch/Main.java b/src/launch/lombok/launch/Main.java index b81b6268..82913f8e 100644 --- a/src/launch/lombok/launch/Main.java +++ b/src/launch/lombok/launch/Main.java @@ -25,12 +25,18 @@ import java.lang.reflect.InvocationTargetException; import java.util.Arrays; class Main { - static ClassLoader createShadowClassLoader() { - return new ShadowClassLoader(Main.class.getClassLoader(), "lombok", null, Arrays.<String>asList(), Arrays.asList("lombok.patcher.Symbols")); + + private static ShadowClassLoader classLoader; + + static synchronized ClassLoader getShadowClassLoader() { + if (classLoader == null) { + classLoader = new ShadowClassLoader(Main.class.getClassLoader(), "lombok", null, Arrays.<String>asList(), Arrays.asList("lombok.patcher.Symbols")); + } + return classLoader; } public static void main(String[] args) throws Throwable { - ClassLoader cl = createShadowClassLoader(); + ClassLoader cl = getShadowClassLoader(); Class<?> mc = cl.loadClass("lombok.core.Main"); try { mc.getMethod("main", String[].class).invoke(null, new Object[] {args}); diff --git a/src/launch/lombok/launch/ShadowClassLoader.java b/src/launch/lombok/launch/ShadowClassLoader.java index 36dd289c..5489f3ea 100644 --- a/src/launch/lombok/launch/ShadowClassLoader.java +++ b/src/launch/lombok/launch/ShadowClassLoader.java @@ -296,17 +296,18 @@ class ShadowClassLoader extends ClassLoader { return null; } - private boolean partOfShadow(URL item, String name) { - return inOwnBase(item, name) || isPartOfShadowSuffix(item, name, sclSuffix); + private boolean partOfShadow(String item, String name) { + return !name.startsWith("java/") + && !name.startsWith("sun/") + && (inOwnBase(item, name) || isPartOfShadowSuffix(item, name, sclSuffix)); } /** * Checks if the stated item is located inside the same classpath root as the jar that hosts ShadowClassLoader.class. {@code item} and {@code name} refer to the same thing. */ - private boolean inOwnBase(URL item, String name) { + private boolean inOwnBase(String item, String name) { if (item == null) return false; - String itemString = item.toString(); - return (itemString.length() == SELF_BASE_LENGTH + name.length()) && SELF_BASE.regionMatches(0, itemString, 0, SELF_BASE_LENGTH); + return (item.length() == SELF_BASE_LENGTH + name.length()) && SELF_BASE.regionMatches(0, item, 0, SELF_BASE_LENGTH); } private static boolean sclFileContainsSuffix(InputStream in, String suffix) throws IOException { @@ -386,12 +387,11 @@ class ShadowClassLoader extends ClassLoader { } } - private boolean isPartOfShadowSuffix(URL item, String name, String suffix) { + private boolean isPartOfShadowSuffix(String url, String name, String suffix) { // Instead of throwing an exception or logging, weird, unexpected cases just return false. // This is better than throwing an exception, because exceptions would make your build tools unusable. // Such cases are marked with the comment: // *unexpected* - if (item == null) return false; - String url = item.toString(); + if (url == null) return false; if (url.startsWith("file:/")) { url = urlDecode(url.substring(5)); if (url.length() <= name.length() || !url.endsWith(name) || url.charAt(url.length() - name.length() - 1) != '/') { @@ -436,14 +436,14 @@ class ShadowClassLoader extends ClassLoader { Enumeration<URL> sec = super.getResources(name); while (sec.hasMoreElements()) { URL item = sec.nextElement(); - if (!partOfShadow(item, name)) vector.add(item); + if (!partOfShadow(item.toString(), name)) vector.add(item); } if (altName != null) { Enumeration<URL> tern = super.getResources(altName); while (tern.hasMoreElements()) { URL item = tern.nextElement(); - if (!partOfShadow(item, altName)) vector.add(item); + if (!partOfShadow(item.toString(), altName)) vector.add(item); } } @@ -483,11 +483,11 @@ class ShadowClassLoader extends ClassLoader { if (altName != null) { URL res = super.getResource(altName); - if (res != null && (!noSuper || partOfShadow(res, altName))) return res; + if (res != null && (!noSuper || partOfShadow(res.toString(), altName))) return res; } URL res = super.getResource(name); - if (res != null && (!noSuper || partOfShadow(res, name))) return res; + if (res != null && (!noSuper || partOfShadow(res.toString(), name))) return res; return null; } @@ -501,12 +501,12 @@ class ShadowClassLoader extends ClassLoader { private URL getResourceSkippingSelf(String name) throws IOException { URL candidate = super.getResource(name); if (candidate == null) return null; - if (!partOfShadow(candidate, name)) return candidate; + if (!partOfShadow(candidate.toString(), name)) return candidate; Enumeration<URL> en = super.getResources(name); while (en.hasMoreElements()) { candidate = en.nextElement(); - if (!partOfShadow(candidate, name)) return candidate; + if (!partOfShadow(candidate.toString(), name)) return candidate; } return null; @@ -526,9 +526,14 @@ class ShadowClassLoader extends ClassLoader { String fileNameOfClass = name.replace(".", "/") + ".class"; URL res = getResource_(fileNameOfClass, true); if (res == null) { - if (!exclusionListMatch(fileNameOfClass)) return super.loadClass(name, resolve); - throw new ClassNotFoundException(name); + if (!exclusionListMatch(fileNameOfClass)) try { + return super.loadClass(name, resolve); + } catch (ClassNotFoundException cnfe) { + res = getResource_("secondaryLoading.SCL." + sclSuffix + "/" + name.replace(".", "/") + ".SCL." + sclSuffix, true); + if (res == null) throw cnfe; + } } + if (res == null) throw new ClassNotFoundException(name); byte[] b; int p = 0; |