aboutsummaryrefslogtreecommitdiff
path: root/src/launch
diff options
context:
space:
mode:
Diffstat (limited to 'src/launch')
-rw-r--r--src/launch/lombok/launch/Main.java5
-rw-r--r--src/launch/lombok/launch/ShadowClassLoader.java24
2 files changed, 29 insertions, 0 deletions
diff --git a/src/launch/lombok/launch/Main.java b/src/launch/lombok/launch/Main.java
index 08298cc2..ff539704 100644
--- a/src/launch/lombok/launch/Main.java
+++ b/src/launch/lombok/launch/Main.java
@@ -34,6 +34,11 @@ class Main {
return classLoader;
}
+ static synchronized void prependClassLoader(ClassLoader loader) {
+ getShadowClassLoader();
+ classLoader.prepend(loader);
+ }
+
public static void main(String[] args) throws Throwable {
ClassLoader cl = getShadowClassLoader();
Class<?> mc = cl.loadClass("lombok.core.Main");
diff --git a/src/launch/lombok/launch/ShadowClassLoader.java b/src/launch/lombok/launch/ShadowClassLoader.java
index da377ae4..e75c300e 100644
--- a/src/launch/lombok/launch/ShadowClassLoader.java
+++ b/src/launch/lombok/launch/ShadowClassLoader.java
@@ -102,6 +102,16 @@ class ShadowClassLoader extends ClassLoader {
private final List<String> parentExclusion = new ArrayList<String>();
private final List<String> highlanders = new ArrayList<String>();
+ private final List<ClassLoader> prependedLoaders = new ArrayList<ClassLoader>();
+
+ public void prepend(ClassLoader loader) {
+ if (loader == null) return;
+ for (ClassLoader cl : prependedLoaders) {
+ if (cl == loader) return;
+ }
+ prependedLoaders.add(loader);
+ }
+
/**
* @param source The 'parent' classloader.
* @param sclSuffix The suffix of the shadowed class files in our own jar. For example, if this is {@code lombok}, then the class files in your jar should be {@code foo/Bar.SCL.lombok} and not {@code foo/Bar.class}.
@@ -529,6 +539,16 @@ class ShadowClassLoader extends ClassLoader {
}
String fileNameOfClass = name.replace(".", "/") + ".class";
+ for (ClassLoader pre : prependedLoaders) {
+ try {
+ URL res = pre.getResource(fileNameOfClass);
+ if (res == null) continue;
+ return urlToDefineClass(name, res, resolve);
+ } catch (Exception e) {
+ continue;
+ }
+ }
+
URL res = getResource_(fileNameOfClass, true);
if (res == null) {
if (!exclusionListMatch(fileNameOfClass)) try {
@@ -540,6 +560,10 @@ class ShadowClassLoader extends ClassLoader {
}
if (res == null) throw new ClassNotFoundException(name);
+ return urlToDefineClass(name, res, resolve);
+ }
+
+ private Class<?> urlToDefineClass(String name, URL res, boolean resolve) throws ClassNotFoundException {
byte[] b;
int p = 0;
try {