1.1 --- a/src/jdk/internal/dynalink/DynamicLinkerFactory.java Thu Aug 01 12:23:38 2013 +0200 1.2 +++ b/src/jdk/internal/dynalink/DynamicLinkerFactory.java Wed Aug 07 16:38:44 2013 +0200 1.3 @@ -84,6 +84,8 @@ 1.4 package jdk.internal.dynalink; 1.5 1.6 import java.lang.invoke.MutableCallSite; 1.7 +import java.security.AccessController; 1.8 +import java.security.PrivilegedAction; 1.9 import java.util.ArrayList; 1.10 import java.util.Arrays; 1.11 import java.util.Collections; 1.12 @@ -117,7 +119,9 @@ 1.13 */ 1.14 public static final int DEFAULT_UNSTABLE_RELINK_THRESHOLD = 8; 1.15 1.16 - private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 1.17 + private boolean classLoaderExplicitlySet = false; 1.18 + private ClassLoader classLoader; 1.19 + 1.20 private List<? extends GuardingDynamicLinker> prioritizedLinkers; 1.21 private List<? extends GuardingDynamicLinker> fallbackLinkers; 1.22 private int runtimeContextArgCount = 0; 1.23 @@ -126,12 +130,13 @@ 1.24 1.25 /** 1.26 * Sets the class loader for automatic discovery of available linkers. If not set explicitly, then the thread 1.27 - * context class loader at the time of the constructor invocation will be used. 1.28 + * context class loader at the time of {@link #createLinker()} invocation will be used. 1.29 * 1.30 * @param classLoader the class loader used for the autodiscovery of available linkers. 1.31 */ 1.32 public void setClassLoader(ClassLoader classLoader) { 1.33 this.classLoader = classLoader; 1.34 + classLoaderExplicitlySet = true; 1.35 } 1.36 1.37 /** 1.38 @@ -260,7 +265,8 @@ 1.39 addClasses(knownLinkerClasses, prioritizedLinkers); 1.40 addClasses(knownLinkerClasses, fallbackLinkers); 1.41 1.42 - final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(classLoader); 1.43 + final ClassLoader effectiveClassLoader = classLoaderExplicitlySet ? classLoader : getThreadContextClassLoader(); 1.44 + final List<GuardingDynamicLinker> discovered = AutoDiscovery.loadLinkers(effectiveClassLoader); 1.45 // Now, concatenate ... 1.46 final List<GuardingDynamicLinker> linkers = 1.47 new ArrayList<>(prioritizedLinkers.size() + discovered.size() 1.48 @@ -303,6 +309,15 @@ 1.49 runtimeContextArgCount, syncOnRelink, unstableRelinkThreshold); 1.50 } 1.51 1.52 + private static ClassLoader getThreadContextClassLoader() { 1.53 + return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { 1.54 + @Override 1.55 + public ClassLoader run() { 1.56 + return Thread.currentThread().getContextClassLoader(); 1.57 + } 1.58 + }); 1.59 + } 1.60 + 1.61 private static void addClasses(Set<Class<? extends GuardingDynamicLinker>> knownLinkerClasses, 1.62 List<? extends GuardingDynamicLinker> linkers) { 1.63 for(GuardingDynamicLinker linker: linkers) {