ServiceLoader.load(Class, ClassLoader) bug
Peter Levart
peter.levart at gmail.com
Thu Sep 13 15:13:39 UTC 2012
Hi,
The javadoc for java.util.ServiceLoader.load(Class service, ClassLoader
loader) method says about it's parameters:
* @param service
* The interface or abstract class representing the service
*
* @param loader
* The class loader to be used to load
provider-configuration files
* and provider classes, or <tt>null</tt> if the system class
* loader (or, failing that, the bootstrap class loader) is
to be
* used
So one might think that calling:
ServiceLoader.load(service, null);
is equivalent to:
ServiceLoader.load(service, ClassLoader.getSystemClassLoader());
But it is not. Either this is a bug in ServiceLoader or javadoc has to
be changed.
If null is specified as ClassLoader then ServiceLoader locates
META-INF/services/interface.name resources using system ClassLoader
(using ClassLoader.getSystemResources), but loads implementation classes
using bootstrap ClassLoader (using Class.forName(className, true, null)).
If this is not the expected behaviour then the fix is simple (in the
private constructor of ServiceLoader[217]):
- loader = cl;
+ loader = cl == null ? ClassLoader.getSystemClassLoader() : cl;
Regards, Peter
More information about the core-libs-dev
mailing list