たとえば、外部フォルダーに既に記述しているクラスをインポートしExample.java
たいc:\class\Example.java
:
var importedClass = new JavaImporter("c:\\class\\Example.java");
また
importClass("c:\\class\\Example.java");
これは ScriptEngine rhino のスクリプトにあります。
どうすればそれができますか???
私はあなたがしたいことを理解しています:
javax.toolsパッケージはコードをコンパイルするためのメカニズムを提供しますが、JDK で実行していない場合はToolProvider.getSystemJavaCompiler()が返さnull
れるため、他のコンパイル メカニズム (外部コンパイラの呼び出し、 Eclipse コンパイラなど)。
Java バイトコード (.class
バイナリ) は、実行時にClassLoaderを介してロードできます。
ロードされたクラスがスクリプト エンジンに表示されるようにするには、 ScriptEngineManager(ClassLoader)コンストラクターを介してクラスを提供する必要があります。
編集:要件に基づいて
public class HelloWorld {
public void say() {
System.out.println("Hello, World!");
}
}
このスクリプトは、Java リフレクション API を呼び出して、ディレクトリHelloWorld.class
からクラスをロードしてインスタンス化するだけです。C:\foo\bin
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();
}
これを行うにはもっとエレガントな方法があると思います。
なぜこれを行うのか疑問に思います。
ここにリストされている解決策は機能します。問題は次のようになります。
私があなたを正しく理解していれば、あなたが実際にやろうとしているのは、(おそらく) インスタンスなどを作成できるように Java クラスをロードすることです。これに対する用語は、インポートではなく動的ロードです。
Java では*.class
、メソッドを使用してバイトコード ファイル ( ) を動的にロードできますClassLoader.loadClass(String)
。このトピックに関するリソースはたくさんあります。たとえば、JNDI チュートリアルの「クラスの読み込み」ページ。このトピックについて理解するために、ある程度の時間を費やす準備をしてください。特に、アプリケーションの通常のクラスパスにないクラスをロードしようとしているため、これを行うには新しいクラスローダーを作成する必要があります。java.lang.ClassLoader
このクラスの Javadocはこちらです。
Java ソース コードを直接ロードすることはできません。最初に Java コンパイラを使用してコンパイルする必要があります。最新の JDK インストールを使用している場合は、実行時に Java コンパイラを呼び出すことができます。ただし、JRE インストールには Java コンパイラは含まれません。プラットフォームに実行時に利用可能な Java コンパイラがある場合は、クラスのgetSystemJavaCompiler()
静的メソッドを介してアクセスできます。ToolProvider
繰り返しますが、実行中の Java アプリケーション内から Java コンパイラを呼び出すのは複雑です。