40

動的なバイトコードの生成、操作、およびウィービング用のフレームワークがいくつかあります (BCEL、CGLIB、javassist、ASM、MPS)。それらについて知りたいのですが、それらすべてについてすべての詳細を知る時間はあまりないので、一方と他方の長所と短所を示した比較表のようなものと、その説明を見てみたいと思います。どうして。

ここSOで、似たようなことを尋ねる多くの質問を見つけました.答えは通常、「cglibまたはASMを使用できます」、または「javassistはcglibよりも優れています」、または「BCELは古くて死にかけています」または「ASMはX と Y が得られるので最適です。」これらの回答は役に立ちますが、私が望む範囲で質問に完全に答えるわけではなく、それらをより深く比較し、それぞれの長所と短所を示しています。

4

3 に答える 3

22

If your interest in bytecode generation is only to use it, the comparison chart becomes rather simple :

Do you need to understand bytecode?

for javassist : no

for all others : yes

Of course, even with javassist you may be confronted with bytecode concepts at some point. Likewise, some of the other libraries (such as ASM) have a more high-level api and/or tool support to shield you from many of the bytecode details.

What really distinguishes javassist though, is the inclusion of a basic java compiler. This makes it very easy to write complex class transformations : you only have to put a java fragment in a String and use the library to insert it at specific points in the program. The included compiler will build the equivalent bytecode, which is then inserted into the existing classes.

于 2012-02-13T04:06:20.327 に答える
7

まず第一に、それはすべてあなたの仕事に依存します。新しいコードを生成したいですか、それとも既存のバイトコードを分析したいですか、また必要な分析がどれほど複雑か。また、Java バイトコードの学習にどれだけの時間を投資したいか。バイトコード フレームワークを高レベル API を提供するフレームワークに分解すると、低レベル オペコードや JVM 内部 (javaassist や CGLIB など) の学習から逃れることができ、JVM を理解する必要がある場合やバイトコードを使用する必要がある場合に低レベル フレームワークを使用することができます。生成ツール (ASM および BCEL)。分析に関しては、歴史的に BCEL がもう少し進化しましたが、ASM は拡張が容易なまともな機能を提供します。また、ASM はおそらく、Java 7 でデフォルトで有効になっている新しいバイトコード検証機能が必要とする STACK_MAP 情報の最も高度なサポートを提供する唯一のフレームワークです。

于 2012-02-07T18:15:28.417 に答える