On 16/09/2014 15:14, Pavel Rappo wrote:
Daniel,
Given that helper.loadClass uses the context class loader,
Should you also simply use
ServiceLoader<InitialContextFactory> loader =
ServiceLoader.load(InitialContextFactory.class);
at lines 680-681 ?
It needs to be the system class loader to allow for JNDI providers that might
be on the class path or module path.
The TCCL would be more appropriate here as that would allow for JNDI
providers that are bundled with the application (the TCCL should
eventually delegate to the system class loader so it should find the
JNDI provider on the class path or linked into the runtime image too).
:
IMO, it's not just an inconvenience, but rather a part of ServiceLoader's design. I mean,
it's definitely designed to provide, so to say, a "one-to-many" mapping for the
classes (providers) that implements some interface (a service) to a client. It merely
delivers you implementations. You should than iterate though them and decide which one
satisfies your needs. I'm not sure it's a good idea to get services based on their
implementation classnames.
Right, it's the user of ServiceLoader that does the selection. The real
issue here of course is the JNDI API where the user specifies the class
name of the implementation factory when creating the initial context.
I've no doubt that it would be done differently if re-designed now.
-Alan