10

「javac」プロセスなどを使用せずに、実行時に文字列からバイトコード (Byte[]) を生成するにはどうすればよいですか? そのようなコンパイラを呼び出す簡単な方法はありますか?

後で追加:

私は自分の状況に実際に最も適した解決策を受け入れることにしました。私のアプリケーションは、まだデザイン スケッチの段階にある趣味のプロジェクトであり、新しいテクノロジの挿入を検討するのに適切な時期です。また、BL で私を助けるはずの人は JavaScript 開発者であるため、この状況では、スタブ コンパイラ + classLoader の代わりに JavaScript インタープリターを使用するという考えがより魅力的に思えます。この質問の他の(受け入れられない)回答は有益であり、私が知る限り、私の質問に非常によく答えてくれるので、ありがとうございますが、Rhinoを試してみます:)

4

4 に答える 4

12

JDK6 にはJava コンパイラ APIがあります。ただし、必ずしも使いやすいとは限りません。

簡単なグーグルは、この使用例を引き出しました。

于 2008-10-13T22:45:51.907 に答える
6

あなたのベストショットはJaninoになると思います。これにより、実行時にコードをコンパイルし、プログラムの残りの部分から呼び出すことができます。一部のシステムでこれを使用して、一部のクラスを動的に更新できるようにします。

無料ではありません。うまく機能しますが、新しいクラス (またはクラスのバージョン) をロードするたびに permgen スペースを使用するため、(本当に) 長時間実行されるプロセス (または多くの新しいクラスをロードするもの) がある場合、最終的にメモリ不足になります。 )しかし、それが問題になる場合は、JVM の permgen スペースの量を変更して、そのバリアをかなり外側に移動できます。

Janino は実際にはコンパイラですが、そのレベルで操作する必要がある場合は、バイトコードを挿入する方法を確認できます。最終的にクラスローダを作成するか、Tom Hawtin が提案したように Java コンパイラ API を使用する必要があるかもしれません。

于 2008-10-13T23:02:50.080 に答える
4

実際には、 rhino や groovy のようなものがより便利であることに気付くかもしれません。

于 2008-10-13T22:27:04.580 に答える
0

JDK の tools.jar ファイルがクラスパスにある限り、コンパイラにアクセスできます。そのドキュメントはhereです。eval()API は一部のインタープリター言語ほど単純ではありませんが、存在します。

実際にそのコードを実行するには、いくつかの奇妙な ClassLoader コードに入る必要があるかもしれませんが、それについては完全にはわかりません。

于 2008-10-13T22:44:35.513 に答える