15

BCELについては知っていますが、このプロジェクトは 2 年間リリースされていなかったため、死んでいるようです。そして、Java の世界は続きます。たとえば、JDK 1.6 には新しい class-file-format があります。

では、JVM のバイトコードを作成するためにどのライブラリを使用できるでしょうか。ライブラリがなくても、バイトコード アセンブラなど、生成されたコードを詳細に操作できれば、プログラムでも問題ありません。

どのソフトウェアをお勧めできますか? 使い方も簡単?良い例/チュートリアルはありますか?

編集:すべての質問に対して:はい、javacは問題ありません。ただし、実行時にいくつかのクラスを生成する場合は、バイトコードへの直接パスの方がクリーンです。

4

7 に答える 7

20

ASM

http://asm.objectweb.org/

BCEL よりもはるかに高速で、ジェネリックと注釈をサポートしています。そのアーキテクチャに関する 1 つのポイント: 高パフォーマンスを確保するために、ASM はイベントをスローするパーサーを中心に構築されます (パーサーがデータ構造を構築する BCEL とは対照的です)。これは、SAX パーサーと DOM パーサーの違いと似ています。この種の考え方に慣れるには、ある程度の練習が必要です。

編集 (McDowell のコメントに続く): 実際、ビジターは ASM で頻繁に使用されますが、単なるビジター以上のものです: ビジターされたデータ構造はパーサーによって遅延構築されるため、クラスファイルの特定の部分に関心がない場合 (たとえば、メソッドの名前を知りたいが、メソッドの本体は気にしない場合)、visitMethod() メソッドから null を返すことができます。これにより、パーサーはメソッド本体セクションをスキップし、メソッドを完全に記述するオブジェクトのネットの (コストのかかる) 構築を防ぎます。

于 2008-11-14T21:28:20.003 に答える
4

CAL(JVM用のHaskellのような言語)の実装で、ASMを使用してJavaのような中間言語からバイトコードを生成するかなり完全な例があります。http://openquark.org/Open_Quark/Download.htmlでソースをダウンロードすると 、コードはAsmJavaByteCodeGenerator.javaにあり、Javaモデルクラスは同じフォルダーにあります。生成されるコードは、基本的にjavacが実行するものから、デバッグアノテーションを除いたものです。

CALの実装では元々BCELを使用していましたが、ASMが大幅に高速(おそらく1桁)であり、ASMはスレッドセーフであるため、CALで必要とされる同時コンパイルが可能であるため、ASMに切り替えました。

于 2008-12-06T06:08:41.320 に答える
2

http://serp.sourceforge.net/は、バイトコードを編集する際にさらに抽象化するための優れたライブラリです。

于 2009-06-18T21:00:42.083 に答える
2

Javassistcglibは、2 つの優れたバイトコード エンジニアリング ライブラリです。これらは、実行時にオブジェクトのプロキシを生成するために、Java EE の世界で広く使用されています。Hibernate と Spring は、これらのライブラリを利用する 2 つの主要なフレームワークです。

于 2008-11-14T22:45:54.450 に答える
1

asm や cglib などのテクノロジがありますが、Javaassistはそのための非常に優れたライブラリであり、 tapestry5フレームワークで例を見つけることができるため、 Javaassist をお勧めします。

于 2008-11-15T00:23:59.430 に答える
-2

私のお気に入りの Java バイトコード クリエータは javac と呼ばれ、www.sun.com で見つけることができます。

于 2008-11-14T21:25:56.843 に答える
-3

Java コンパイラ javac を使用しないのはなぜですか? それを使用して JVM バイトコードを生成することの何が問題になっていますか?

[真剣に。ソースを取得し、Java を作成してコンパイルすることを妨げるものは何ですか?]

于 2008-11-14T21:26:24.563 に答える