I understand that you want to:
- Compile a Java source file
- Load the compiled code
- Use the resultant class in some JavaScript
The javax.tools package provides a mechanism for compiling code, though if you're not running in a JDK, ToolProvider.getSystemJavaCompiler() will return null
and you'll have to rely on some other compilation mechanism (invoking an external compiler; embedding the Eclipse compiler; etc.).
Java bytecode (.class
binaries) can be loaded at runtime via ClassLoaders.
In order for the loaded classes to be visible to your scripting engine, you'll need to provide them via the ScriptEngineManager(ClassLoader) constructor.
EDIT: based on the requirements
public class HelloWorld {
public void say() {
System.out.println("Hello, World!");
}
}
This script just invokes the Java reflection API to load and instantiate a class HelloWorld.class
from the C:\foo\bin
directory:
function classImport() {
var location = new java.net.URL('file:/C:/foo/bin/');
var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1);
urlArray[0] = location;
var classLoader = new java.net.URLClassLoader(urlArray);
return classLoader.loadClass("HelloWorld");
}
var myClass = classImport();
for(var i=0; i<10; i++) {
myClass.getConstructor(null).newInstance(null).say();
}
There are more elegant ways of doing this, I'm sure.