On Oct 3, 2012, at 2:41 PM, Peter Levart <[email protected]> wrote:
> I think that in the LazyIterator.hasNext() you still have to check for null > loader: > > 337 if (loader == null) > 338 configs = > ClassLoader.getSystemResources(fullName); > 339 else > 340 configs = loader.getResources(fullName); > > > Because the ClassLoader.getSystemClassLoader() can return null. In that case, > ClassLoader.getSystemResources() delegates just to .getBootstrapResources() > which is in sync with later: > > > 359 S p = service.cast(Class.forName(cn, true, loader) > 360 .newInstance()); > > > when loader is null - i.e. it loads just bootstrap classes. > Yes, thanks, i just caught that silly mistake just before i received your email :-) , the webrev is updated. -- For the benefit of others; for some context see this recent thread: http://markmail.org/search/?q=openjdk#query:openjdk%20list%3Anet.java.openjdk.core-libs-dev%20order%3Adate-backward+page:2+mid:inod424lqbey5fms+state:results Basically ServiceLoader is treating a null CL parameter as the system CL for loading the META-INF/services resources file and as the bootstrap CL for loading the classes of class names declared in those resource files. Which also means that calls to: ServiceLoader.load(serviceInterface) ServiceLoader.load(serviceInterface, Thread.currentThread().getContextClassLoader()); Will behave oddly if the TCCL is null, from the JavaDoc of Thread.getContextClassLoader(): http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getContextClassLoader() Returns: the context ClassLoader for this Thread, or null indicating the system class loader (or, failing that, the bootstrap class loader) Paul.
