RFR [JDK8]: 7169894: JAXP Plugability Layer: using service loader
Paul Sandoz
paul.sandoz at oracle.com
Thu Aug 30 15:47:16 UTC 2012
On Aug 30, 2012, at 8:59 AM, Joe Wang <huizhe.wang at oracle.com> wrote:
> Alan, Paul,
>
> While I was writing a summery as you suggested below, I noticed an issue with using ServiceLoader. I was trying to use the word 'delegate' but found the ServiceLoader might be doing sth. different than the original jaxp process.
>
> Here's the spec:
> The ServiceLoader.load(service) is equivalent to ServiceLoader.load(service, Thread.currentThread().getContextClassLoader()) where "loader - The class loader to be used to load provider-configuration files and provider classes, or null if the system class loader (or, failing that, the bootstrap class loader) is to be used "
>
>
> Somehow, our earlier discussion concluded that the original process I created, where the context class loader is tried first, if no provider found, bootstrap classloader will be tried next, could be 'delegated' to the ServiceLoader. But the above didn't really showed that. When I looked at the code, it actually simply returns false if loader.getResources fails to find a provider.
The CL.getResources will also delegate to the parent CL if one is present which should eventually get to the bootstrap CL.
> Also, it calls ClassLoader.getSystemResources when loader=null. The later would be a regression to CR6723276 if we had called ServiceLoader.load(service, loader) with loader=null.
>
Seems as OK as i said in the previous email, since Object.class.getResourceAsStream does:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0(); // <--- This will be null for Object.class
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name); // <--- Look!
}
return cl.getResourceAsStream(name);
}
This area is complicated i think you need to write some SL tests.
Paul.
More information about the core-libs-dev
mailing list