- PR -

BCELの使用法について

1
投稿者投稿内容
おじゃるまる
会議室デビュー日: 2001/12/11
投稿数: 17
投稿日時: 2002-12-15 18:33
javaにて、クラスファイル(×××.class)の構造を分析する事になりまして、
何かいいライブラリはないかと探した所、jakartaプロジェクトのBCELなるものが
利用できるのではないかと思い早速ダウンロードしてみました。

そこで、マニュアルなるページや、APIリファレンスを読んでみたんですが、
私としては、マニュアルや、APIリファレンスのみですと、概要程度しか理解できず、
BCELを使いこなす所まではたどりついておりません。

もちろん、これからも理解を深める事は言うまでもありませんが、
もし、BCELを利用する上で何か役に立つ情報やサイトがありましたら、
お教えして頂けないでしょうか?
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2002-12-15 21:29
exampleのソースをみるのが一番早いですよ。exampleの実行結果と、
ソースとを比べて、適当に直してつかってれば、そのうち分かるよう
になります。

byteファイルの構造を知ってればさほど難しくないですよ。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2002-12-15 21:35
検索してみましたが、APIドキュメントより分かりやすい解説は見つかりませんでした。
お役に立てるか分かりませんが、具体的にお困りの点は何でしょうか?
おじゃるまる
会議室デビュー日: 2001/12/11
投稿数: 17
投稿日時: 2002-12-16 10:59
Kissingerさん、t-wataさん、ありがとうございます。

 私が今、やれることは、JavaClassクラスに指定したクラスファイルをパースして、
その中のメソッド一覧、フィールド一覧をMethodクラス、Fieldクラスに取得する所までは
できたんですが、これらの型、メソッドならばパラメーター等の情報やローカル変数の情報を
どうやってアクセスして得ればいいのか?というのがまだ見えておりません。
 上記の情報を属性として例えるならば、これらの属性はMethodクラス、Fieldクラスにどのように
関わっているのか?という事が見えてないと言う事だと思います。
また、メソッドの情報としてメソッド内にどういったローカル変数があるのか?
というのも見えておりません。

byteファイルの構造を先に勉強して、APIドキュメントを参考にBCELを使用してみようとしたのですが、
結局は、byteファイルの構造がわかっていない為の疑問になっていると思い、平行してbyteファイルの
構造も再度勉強している最中です。

以下に、この時点での私の理解度を示します。
(特別パッケージ名を指定しない場合は「org.apache.bcel.classfile」だと思って下さい。)
1.JavaClassにクラスファイルをパースする。
  (これで、クラスファイルがオブジェクトとして操作できる)

2.JavaClassの[] getMethods()を使用してMethodオブジェクトを取得する。
  (これで、メソッドがオブジェクトとして操作できる)

3.2にて取得したMethodオブジェクトからアクセスフラグ、メソッド名を取得する。
  (MethodsクラスはAccessFlagsクラスを継承している為、これらの操作が行える)

4.Fieldクラスにおいても、2,3と同様の処理を行う。


byteファイル構造の理解度を深め、APIドキュメントと照らし合わせながらBCELの使用方を
つかんで行こうと思います。

私の考え方で何か誤っている部分や、もっとこうした方がいいと言う物が
ありましたら、また、ご意見お願いいたします。

t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2002-12-16 13:05
目的が分からないので何とも言えません。
引用:

3.2にて取得したMethodオブジェクトからアクセスフラグ、メソッド名を取得する。
  (MethodsクラスはAccessFlagsクラスを継承している為、これらの操作が行える)

4.Fieldクラスにおいても、2,3と同様の処理を行う。


これだけなら、java.lang.reflectでできます。
BCELを使う目的は何でしょうか?
また、以下のソースはご覧になりましたか?
http://bcel.sourceforge.net/listclass.java
これを改造するだけで大抵の事はできますよ。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2002-12-16 23:24
おじゃるまるさん、それだけわかっていたら大抵のことできちゃいますよ。
でも、フィールドやメソッドのパラメタを確認するだけなら、t-wataさんの
言うとおり reflectパッケージの方が楽です。フィールドの値を読んだり、
メソッドを呼び出すテストツール等も作ることができます。(多分、おじゃ
るまるさん自身ご存知な気がするのですが。)

ただ、関連するクラスが揃ってない(一部のクラスしかない)時にはローデ
ィングできませんので、BCELの様にクラスファイルを扱う仕組みが役に立ち
ます。(工夫が要るけど)
あと、逆アセンブラ、逆コンパイラを作る羽目になったときにも役立つでし
ょう。
1

スキルアップ/キャリアアップ(JOB@IT)