みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【Java】参照型で宣言された変数名の抽出

現在、Javaを学習中の大学生です。

Javaのソースコードを解析し、その中で宣言されている変数名を抽出して、
変数表のようなものを作成するJavaプログラムを書いているのですが、
参照型(クラス型)で宣言されている変数名を抽出する方法が思いつきません。
よろしければ、何かアイディアをいただけないでしょうか。

プリミティブ型の変数については、StreamTokenizerクラスを利用しています。
コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
するという、単純な方法を使っています。こちらも、改良すべき点などあれば、
アドバイスいただけるとありがたいです。

デバッガを使えば出来ないことはないようですが、
出来ればデバッガは使わない方法でお願いします。

投稿日時 - 2011-10-13 23:13:54

QNo.7069998

困ってます

質問者が選んだベストアンサー

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
でしなければならない事の概要としては間違っていないと思いますが、
実装の上ではjavaがフリーフォーマットである事に注意して下さい。
型名の途中にホワイトスペースが挟まる事はありませんが、配列の場合こんな書き方も出来ますので。

int a
[
];

また、その際にローカル変数を抽出の対象にしないのであれば、
更に宣言スコープ等を考慮する必要が出てきますし、
これに内部クラスや匿名クラスのフィールドも混ざってくると非常にややこしい事になると思いますが、不可能ではありません。
がんばってください。

投稿日時 - 2011-10-14 15:52:47

お礼

アドバイスありがとうございます。
ローカル変数も対象としています。
(もう少し詳しく書くべきでした。すみません)
確かに、javaはフリーフォーマットなので
ややこしいところもありますが、
解析対象となるコードは、教科書に載っているような、
お手本コードなので、あまり心配はしていません。
しかし、そういった部分もカヴァーするに越したことは
ないので、時間に余裕があるかぎり検討したいと思います。
また、mamadorusuさんのアドバイスがきっかけで、
今まで見落としていた問題も見えてきました。
そういう点で参考になりましたので、
こちらをベストアンサーとさせていただきます。

投稿日時 - 2011-10-16 20:29:50

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

http://192.9.162.55/j2se/1.5.0/ja/docs/ja/api/java/lang/Class.html

ヒント:リフレクション。

投稿日時 - 2011-10-14 14:37:33

お礼

ヒントありがとうございます。
出来れば、ソースコードから抽出したいのですが、
(もう少し詳しく書くべきでした。すみません)
これもひとつの方法として参考にしたいと思います。

投稿日時 - 2011-10-16 20:16:45

あなたにオススメの質問