Ich verstehe, dass Sie zu wollen:
- Erstellen Sie eine Java-Quelldatei
- laden den kompilierten Code
- Verwenden Sie die resultierende Klasse in einigen JavaScript
Das javax.tools Paket bietet eine Mechanismus zum Kompilieren von Code, obwohl, wenn Sie nicht in einem JDK laufen, wird ToolProvider.getSystemJavaCompiler()null
zurückgeben und Sie müssen sich auf Som verlassen der andere Kompilierungsmechanismus (Aufruf eines externen Compilers; Einbetten des Eclipse-Compilers; etc.).
Java-Bytecode (.class
Binaries) kann zur Laufzeit über ClassLoader s geladen werden.
Damit die geladenen Klassen für Ihre Skript-Engine sichtbar sind, müssen Sie sie über den ScriptEngineManager(ClassLoader)-Konstruktor bereitstellen.
EDIT: basierend auf den Anforderungen
public class HelloWorld {
public void say() {
System.out.println("Hello, World!");
}
}
Dieses Skript ruft nur das Java-Reflection-API eine Klasse HelloWorld.class
aus dem C:\foo\bin
Verzeichnis zu laden und instantiieren:
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();
}
Es gibt mehr elegante Wege, das zu tun, da bin ich mir sicher.
Warum können Sie den Klassenpfad nicht verwenden? –
Möchten Sie eine Java-Klasse in JavaScript importieren, die mit Rhino ausgeführt wird? Oder möchten Sie eine JavaScript-Klasse in Java mit Rhino importieren? –
Ich möchte eine Java-Klasse in eine JavaScript-Datei importieren, die mit Rhino ausgeführt wird :) das ist es –