JEP 330 and MemoryClassLoader.getResourceAsStream
Jonathan Gibbons
jonathan.gibbons at oracle.com
Tue Sep 4 15:02:07 UTC 2018
On 9/4/18 5:17 AM, Peter Levart wrote:
> Hello,
>
> On 08/27/2018 04:11 AM, seth lytle wrote:
>> to add to what Jon said, recompiling doesn't necessarily provide the
>> correct info as it may have been manipulated by another agent or
>> classloader (there is a similar weakness in my current workaround)
>>
>> getResourceAsStream (getRAS) is:
>> - robust: you know it's the same bytecode your parent CL used
>> - flexible: you can run woven and unwoven code concurrently
>> - chainable: downstream CLs will see your modifications
>>
>>
>> i haven't been able to think of anything that getResource adds,
>> though some people may use that instead
>>
>> on the core-libs-dev list david lloyd wrote:
>> > Why not go ahead and implement getResource as well? It's not *that*
>> > big of a deal to add a URL handler, and it would be a fairly
>> trivial one.
>>
>>
>> @jon - would you like to reply to that or should i ?
>>
>> my feeling is that we're better off without getResource (getR)
>> - the javadocs appear to allow differences between getR and getRAS
>> - getR adds complexity, startup cost and increases footprint
>
> Not that much. Most code can be in separate classes which are loaded
> only if .getResourceXXX is actually used.
>
>> - we're not aware of a consumer of the getR api
>
> Which does not mean there is none.
>
>> - the only resource is bytecode, and that's naturally accessed as a
>> stream
>> - many things are changing with java 11 so any bytecode-modifying
>> library is likely to need to make source code changes anyway
>>
>> the only problem i see with not implementing getR is that there's no
>> way to convey to a hypothetical consumer of the API that the bytecode
>> that they're looking for is available via getRAS
>
> The correct way, I think, is to implement findResource() and
> findResources(). getResource(), getResources() and
> getResourceAsStream() are just front-end methods to be called by
> users. They implement ClassLoader delegation model and call
> findResource(s) at appropriate time. Making getResourceAsStream()
> available, but getResource() always return null (or even throw
> exception?) would be a precedent, I think.
>
> Here's a prototype that works and is not that complicated:
>
> http://cr.openjdk.java.net/~plevart/jdk-dev/MemoryClassLoader_getResource/webrev.01/
>
>
> Someone might say that the URL protocol in this implementation does
> not allow parsing such URL(s) from String(s). That's true, but if one
> wanted to do that, one would have to identify (in the URL) the target
> MemoryClassLoader instance. There may be more than one
> MemoryClassLoader instance in the JVM. Comparing it to other
> protocols: in http://host:port/path/resource, the host:port part of
> the URL uniquely identifies the http server, where the resources are
> located; in file:///path/resource, the protocol refers to the single
> local file system on the host machine where the JVM is running, etc.
> How would one identify multiple instances of MemoryClassLoader such
> that their unique "names" would be known in advance? No way.
>
> I think that the presented prototype strikes the balance where the
> full resource resolving API of ClassLoader is implemented, while the
> URL protocol is not supported in a way that would allow parsing such
> URL(s) from String(s).
>
> If this is acceptable compromise, I suggest moving in this direction.
>
> Regards, Peter
>
Peter,
Thank you for your suggestion. We already have a prototype that
provides getResource, getResources and getResourceAsStream, by
implementing findResource and findResources. There are issues related
to the possible presence of a security manager, which we are working to
resolve. I'll be posting a webrev for review soon.
-- Jon
Peter,
Thank you for your suggestion. We already have a prototype that
provides getResource, getResources and getResourceAsStream, by
implementing findResource and findResources. There are issues related
to the possible presence of a security manager, which we are working to
resolve. I'll be posting a webrev for review soon.
-- Jon
More information about the compiler-dev
mailing list