aboutsummaryrefslogtreecommitdiff
path: root/src/launch
diff options
context:
space:
mode:
Diffstat (limited to 'src/launch')
-rw-r--r--src/launch/lombok/launch/Main.java2
-rw-r--r--src/launch/lombok/launch/ShadowClassLoader.java45
2 files changed, 24 insertions, 23 deletions
diff --git a/src/launch/lombok/launch/Main.java b/src/launch/lombok/launch/Main.java
index ff539704..af65bdf8 100644
--- a/src/launch/lombok/launch/Main.java
+++ b/src/launch/lombok/launch/Main.java
@@ -36,7 +36,7 @@ class Main {
static synchronized void prependClassLoader(ClassLoader loader) {
getShadowClassLoader();
- classLoader.prepend(loader);
+ classLoader.prependParent(loader);
}
public static void main(String[] args) throws Throwable {
diff --git a/src/launch/lombok/launch/ShadowClassLoader.java b/src/launch/lombok/launch/ShadowClassLoader.java
index e75c300e..929681ce 100644
--- a/src/launch/lombok/launch/ShadowClassLoader.java
+++ b/src/launch/lombok/launch/ShadowClassLoader.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014-2018 The Project Lombok Authors.
+ * Copyright (C) 2014-2021 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -38,6 +38,7 @@ import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -102,14 +103,12 @@ 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>();
+ private final Set<ClassLoader> prependedParentLoaders = Collections.newSetFromMap(new IdentityHashMap<ClassLoader, Boolean>());
- public void prepend(ClassLoader loader) {
+ public void prependParent(ClassLoader loader) {
if (loader == null) return;
- for (ClassLoader cl : prependedLoaders) {
- if (cl == loader) return;
- }
- prependedLoaders.add(loader);
+ if (loader == getParent()) return;
+ prependedParentLoaders.add(loader);
}
/**
@@ -539,23 +538,25 @@ 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 {
- return super.loadClass(name, resolve);
- } catch (ClassNotFoundException cnfe) {
- res = getResource_("secondaryLoading.SCL." + sclSuffix + "/" + name.replace(".", "/") + ".SCL." + sclSuffix, true);
- if (res == null) throw cnfe;
+ if (!exclusionListMatch(fileNameOfClass)) {
+ try {
+ // First search in the prepended classloaders, the class might be their already
+ for (ClassLoader pre : prependedParentLoaders) {
+ try {
+ Class<?> loadClass = pre.loadClass(name);
+ if (loadClass != null) return loadClass;
+ } catch (Throwable e) {
+ continue;
+ }
+ }
+
+ 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);