サーバー側のC#アプリをJavaに移植し始めました。それが行うことの1つは、CodeDOMフレームワークを使用してコードを動的に生成し、それをバイトコードにコンパイルし、実行時にクラスをロードすることです。メソッドの軽量で動的な生成に式ツリーを使用したシナリオもあります。
私はいくつかの調査を行いましたが、私が最も近かったのはJavaassistだと思います。動的なコード生成とコンパイルをサポートする他のフレームワークがあれば幸いです。私はJavaの世界で新入社員です。
サーバー側のC#アプリをJavaに移植し始めました。それが行うことの1つは、CodeDOMフレームワークを使用してコードを動的に生成し、それをバイトコードにコンパイルし、実行時にクラスをロードすることです。メソッドの軽量で動的な生成に式ツリーを使用したシナリオもあります。
私はいくつかの調査を行いましたが、私が最も近かったのはJavaassistだと思います。動的なコード生成とコンパイルをサポートする他のフレームワークがあれば幸いです。私はJavaの世界で新入社員です。
JavaコンパイルAPIがあります(たとえば、http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/)。
式を評価する必要があるだけの場合は、OGNLやMVELなどのELを検討してください。
Groovy、JRuby、およびScalaは、単純な式の評価から本格的なJavaインタラクションまで、幅広いオプションを可能にする最も主流の動的言語です。
クラスを変更するには、javaassit、asm、cglib(実際には、asmに依存します)、bcelなどを使用できます。その中でも、軽量でパフォーマンスが優れているため、asmをお勧めします。
asmを使用すると、いくつかのクラスを動的に生成できます。ただし、jvmで実行されているクラスを変更する場合は、JavaInstrumentAPIを使用して既存のクラスを再変換する必要があります。
詳細については、このペーパーを参照してください。http://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf
oracleのInstrumentに関するその他のドキュメント。 http://docs.oracle.com/javase/6/docs/technotes/guides/instrumentation/index.html
Janinoを動的コード生成に使用することに成功しました。Javassistと同様に、Javaソースコードをメモリ内でコンパイルできます。また、Javassistと同様に、Java 1.5言語機能がありませんが、それ以外は使いやすいです。
SimpleCompilerクラスは良い出発点です。
jvmをターゲットにしたlisp(または他の動的言語)を調べます。 wiki記事