Capisco che si desidera:
- compilare un file sorgente Java
- Caricare il codice compilato
- Utilizzare la classe risultante in qualche JavaScript
Il pacchetto javax.tools fornisce una meccanismo per la compilazione del codice, anche se non si esegue in un JDK, ToolProvider.getSystemJavaCompiler() restituirà null
e si dovrà fare affidamento su e altri meccanismi di compilazione (invocazione di un compilatore esterno; incorporare il compilatore Eclipse; eccetera.).
bytecode Java (binari .class
) possono essere caricati in fase di esecuzione tramite ClassLoader s.
Affinché le classi caricate siano visibili al motore di scripting, è necessario fornirle tramite il costruttore ScriptEngineManager(ClassLoader).
EDIT: sulla base dei requisiti
public class HelloWorld {
public void say() {
System.out.println("Hello, World!");
}
}
Questo script solo richiama la riflessione API Java per caricare e istanziare una classe HelloWorld.class
dalla 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();
}
ci sono più modi eleganti per farlo, ne sono sicuro.
Qualsiasi motivo non è possibile utilizzare il classpath? –
Vuoi importare una classe Java in JavaScript che verrà eseguita usando Rhino? O vuoi importare una classe JavaScript in Java usando Rhino? –
Voglio importare una classe Java in un file JavaScript che verrà eseguito utilizzando Rhino :) questo è –