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






Reply via email to