1

わかりましたので、ユーザーが.javaファイルを書き込んで実行できるプログラムがあります(実行時....duh!!)。現在、ユーザーは 1 つの .java ファイルのみを編集できます (現時点では)。次に、.java ファイルをコンパイルして、.class ファイルにします。ファイルを実行するには、ユーザーがvoid main()関数を持っていることを期待しており、その関数を実行して実行するだけです。そのため、JTextArea、BufferedReader、BufferedWriterなどを使用して.javaファイルを編集可能にしました。ファイルをコンパイルするために書いたコードは次のとおりです。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) {
    Iterable<? extends JavaFileObject> compilationUnits = filemanager.getJavaFileObjectsFromStrings(Arrays.asList("src/User/Script.java"));
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
    boolean success = task.call();
    System.out.println(success);
} catch(IOException e){
    System.out.println("IOException");
}

このコードは、ファイルを .class ファイルにコンパイルします。そこからメイン関数を実行すると、機能しません。実際、成功の値は true です (true と表示されます)。これが完了したら、ユーザーは「実行」ボタンを押し、これを使用して関数を実行します。

Script script = new Script(); script.main();

何らかの理由で、スクリプトが更新されません。スクリプトが変更される前に書かれたものと同じものを実行します....ファイルは期待どおりに書かれていますが、スクリプトは次回プログラムが起動されたときにのみ何らかの「更新」を行います。(これをスタンドアロンとして試したことはありませんが、Netbeans である IDE で更新されます)。

この問題の解決策が必要なだけでなく、何が行われているのかについての説明も必要です。何が間違っているのか、なぜ間違っているのか、それを修正するために何をする必要があるのか​​ を説明してください.

よろしく、
ラクシット

4

1 に答える 1

2

ここでの問題は、クラスがすでに JVM にロードされていることです。クラスをアンロードして、新しいバージョンを再ロードする必要があります。アプリケーションを起動する前にクラスが存在しなかった場合でも機能するはずです。

そのようなことを機能させるには、独自のクラスローダーを作成する必要があります。これは確かに難しい作業です。 javassistを除いて、そのためのライブラリ/ツールは知りません。

良いハックは、目的のクラスまたはパッケージの名前を変更することですが、これが受け入れられるかどうかはわかりません.

于 2014-05-11T10:12:36.100 に答える