generated code and jigsaw modules
Richard Hillegas
rhillegas at comcast.net
Thu Oct 11 00:33:42 UTC 2018
Thanks, Alan. This is very helpful.
On 10/10/18 9:53 AM, Alan Bateman wrote:
> On 10/10/2018 16:37, Richard Hillegas wrote:
>> :
>>
>> java.lang.invoke.MethodHandles.lookup().defineClass(generatedClassBytes)
>>
>> This approach does indeed put the generated class where I want it:
>> inside the Derby engine module. Unfortunately, the ClassLoader of the
>> generated class is the application class loader. I can't figure out
>> how to force the generated class to use the custom ClassLoader instead.
> MethodHandles.lookup() creates a Lookup to the caller of the method so
> I assume you must be calling it from Derby code on the class path. If
> you want the class generated in the same runtime package as the code
> loaded from the database then you'll need to get a Lookup object to a
> class in that runtime package, perhaps with privateLookupIn.
>
>>
>> Alan's approach is a bit more complicated. It involves following the
>> pattern in
>> com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl. It
>> involves generating a temporary module for each generated class and
>> then adding more export directives to the engine module so that the
>> generated module can call back into the engine. I have to say I'm a
>> little confused about the implications of slow memory leaks with this
>> approach. I don't know what happens to these generated modules and
>> export directives when the generated class is garbage-collected.
>>
>> More immediately, however, I am up against the same problem which
>> plagues Rémi's approach: how do I get the generated module to resolve
>> classes in the custom ClassLoader? More specifically, I am stuck
>> trying to get the generated module to require the user-written
>> modules, that is, the user-written jar files. What I am missing is
>> the ability to retrieve the module names of these jar files so that I
>> can craft requires directives. The only way I know to get a module
>> name is to use ModuleFinder.of(Path...). Unfortunately, the Path
>> interface is an abstraction for file systems and is not a good fit
>> for locating a blob of bytes stored inside a database.
> My mail wasn't suggesting an approach, I was just pointing out an
> example of code in the JDK that creates a dynamic module to
> encapsulate generated code. It just happens that there is one class in
> that module.
>
> As regards classes in the database then it would require developing
> your own ModuleFinder that can find modules in the database. There was
> an example on jigsaw-dev recently where someone was looking for a
> ModuleFinder to find modules in WAR files [1] which might be useful to
> get an idea on what is involved.
>
> -Alan
>
> [1]
> http://mail.openjdk.java.net/pipermail/jigsaw-dev/2018-September/013924.html
>
>
>
>
>
More information about the core-libs-dev
mailing list