5

たとえば、外部フォルダーに既に記述しているクラスをインポートしExample.javaたいc:\class\Example.java:

var importedClass = new JavaImporter("c:\\class\\Example.java");

また

importClass("c:\\class\\Example.java");

これは ScriptEngine rhino のスクリプトにあります。
どうすればそれができますか???

4

3 に答える 3

5

私はあなたがしたいことを理解しています:

  1. Java ソース ファイルをコンパイルする
  2. コンパイルされたコードをロードする
  3. 結果のクラスを JavaScript で使用する

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();
}

これを行うにはもっとエレガントな方法があると思います。

于 2010-06-22T14:11:07.220 に答える
1

なぜこれを行うのか疑問に思います。

ここにリストされている解決策は機能します。問題は次のようになります。

  1. トラブルシューティングが困難なリフレクションを使用して、石畳のソリューションが作成されます。
  2. 顧客は、実行時にロードされるコードにパッチを適用することに問題はありませんか? 私が働いた場所はどこもそうではありません。
于 2010-06-23T01:33:20.520 に答える
0

私があなたを正しく理解していれば、あなたが実際にやろうとしているのは、(おそらく) インスタンスなどを作成できるように Java クラスをロードすることです。これに対する用語は、インポートではなく動的ロードです。

Java では*.class、メソッドを使用してバイトコード ファイル ( ) を動的にロードできますClassLoader.loadClass(String)。このトピックに関するリソースはたくさんあります。たとえば、JNDI チュートリアルの「クラスの読み込み」ページ。このトピックについて理解するために、ある程度の時間を費やす準備をしてください。特に、アプリケーションの通常のクラスパスにないクラスをロードしようとしているため、これを行うには新しいクラスローダーを作成する必要があります。java.lang.ClassLoaderこのクラスの Javadocはこちらです。

Java ソース コードを直接ロードすることはできません。最初に Java コンパイラを使用してコンパイルする必要があります。最新の JDK インストールを使用している場合は、実行時に Java コンパイラを呼び出すことができます。ただし、JRE インストールには Java コンパイラは含まれません。プラットフォームに実行時に利用可能な Java コンパイラがある場合は、クラスのgetSystemJavaCompiler()静的メソッドを介してアクセスできます。ToolProvider繰り返しますが、実行中の Java アプリケーション内から Java コンパイラを呼び出すのは複雑です。

于 2010-06-22T14:05:24.993 に答える