3

外部に保存されたソースコードを使用してJavaプログラムにロードし、それを使用できるようにする方法はありますか?

完全なソースコードを編集せずに変更できるプログラムが欲しいのですが、これは毎回コンパイルしなくても可能です。もう1つの利点は、コードの一部を好きなように変更できることです。

もちろん、これにデータを送信して固定ソースプログラムに戻すことができるように、インターフェイスが必要です。

そしてもちろん、それは純粋な通訳システムよりも速いはずです。

それで、これらの外部ソースコード部分の追加のコンパイルとこれが行われた後のプログラムの開始のようなこれを行う方法はありますか?

よろしくお願いします、アンドレアス:)

4

3 に答える 3

9

これにはjavax.toolsAPIが必要です。したがって、動作させるには、少なくともJDKをインストールする必要があります(そして、IDEがJREの代わりにJDKを指すようにします)。基本的なキックオフの例を次に示します(基本的な例の不透明度を下げるための適切な例外とエンコーディング処理を除いて、をします)。

public static void main(String... args) throws Exception {
    String source = "public class Test { static { System.out.println(\"test\"); } }";

    File root = new File("/test");
    File sourceFile = new File(root, "Test.java");
    Writer writer = new FileWriter(sourceFile);
    writer.write(source);
    writer.close();

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, sourceFile.getPath());

    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
    Class<?> cls = Class.forName("Test", true, classLoader);
}

これはtest、テストソースコードの静的初期化子によって行われるように、stdoutで出力されるはずです。それらのクラスがすでにクラスパスにある特定のインターフェースを実装している場合、さらに使用するのはより簡単です。それ以外の場合は、メソッド/フィールドにアクセスして呼び出すためにReflectionAPIを使用する必要があります。

于 2009-12-30T19:18:12.183 に答える
1

Java 6以降では、javax.toolsパッケージを介してコンパイラにアクセスできます。ToolProvider.getSystemJavaCompiler()は、javax.tools.JavaCompilerを取得します。これは、ソースをコンパイルするように構成できます。以前のバージョンのJavaを使用している場合でも、柔軟性は大幅に低下しますが、内部のcom.sun.tools.javac.Mainインターフェースを介してアクセスできます。

于 2009-12-30T19:15:26.370 に答える
0

Java6にはスクリプトAPIがあります。私はこれをJavascriptで使用しましたが、外部のJavaコードをコンパイルすることもできると思います。

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/

編集:より関連性の高いリンクは次のとおりです: Javaアプリケーションの「動的ソース」コード

于 2009-12-30T18:50:55.260 に答える