aboutsummaryrefslogtreecommitdiff
path: root/src/launch
diff options
context:
space:
mode:
authorPhilippe Charles <charphi@users.noreply.github.com>2018-08-22 09:54:00 +0200
committerGitHub <noreply@github.com>2018-08-22 09:54:00 +0200
commit3ffac6642456e2c7d32952c62df8a565e2d4728b (patch)
treeb0a28ac208dcb8af9add494c4caffe4f11bb287b /src/launch
parent35c7c6bda2e71da2e6e06cec5b0fb012c348f694 (diff)
parent769185e123dfd4a073161eafb58ce50bb79d6201 (diff)
downloadlombok-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.java2
-rw-r--r--src/launch/lombok/launch/AnnotationProcessor.java2
-rw-r--r--src/launch/lombok/launch/Main.java12
-rw-r--r--src/launch/lombok/launch/ShadowClassLoader.java37
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;