- PR -

メソッド名の取得

1
投稿者投稿内容
taka
会議室デビュー日: 2008/03/22
投稿数: 9
投稿日時: 2008-12-17 23:25
以下の内容が実現可能か不可能かeclipseのエディター、アウトラインみたいなことができるなら可能だと思っています。
可能であれば利用するパッケージ名(もしくはクラス名)等ヒントを頂きたく
宜しくお願い致します。

目的:javaファイルの行数からその行のを含むメソッド名を取得する(実行ファイルではない)

条件:javaファイルはコンパイル可能、classファイルも使用可能

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-18 00:47
EclipseのJDTがライブラリとしても配布されていますので、
自前のプロジェクトに組み込んで、ASTを作ったりコンパイルすることもできます。
(これは、試したことはありません。)

単にメソッドと行番号の対応表を作りたいのであれば、
バイトコードライブラリでも取得できます。
(コンパイル時のデバッグオプションで行番号属性が存在する前提)

例えばJavassistでは、ClassFileというクラスを.classファイルから作成し、
メソッドを示すMethodInfoを取得します。
MethodInfoからコード属性テーブルを取得し、コード属性内に含まれる、
行番号属性テーブルを取得するという流れになります。
インストラクション単位で行番号を取得することができますよ。

ただしバイトコードの制約として、行番号はコード属性に含まれるものですから、
抽象メソッドやフィールドから取得することはできません。
ですので、汎用的な目的があるのでしたら、
ASTを作成するタイプのライブラリが便利かと思います。
taka
会議室デビュー日: 2008/03/22
投稿数: 9
投稿日時: 2008-12-18 21:04
かつのりさん
回答頂きありがとうございます。

かつのりさんからのヒントから今回の調査の足跡も記述します。

1、ASTについて

ASTの利用方法
http://www.ibm.com/developerworks/jp/opensource/library/os-ast/index.html

ASTParser のバージョン
http://okowa.org/vector/2005/11/16/eclipse-astparser

古いバージョンのエクリプス
http://archive.eclipse.org/eclipse/downloads/

結果:スタンドアロンでjava1.5以降のソースは解析できない。

2、Javassistについて

Javassistの利用方法
http://www.csg.is.titech.ac.jp/~chiba/notes/javapress03/index.html

結果:メソッド終了行の取得は可能だった。
メソッド開始後初めのステートメント(?)行の取得は可能だった。

**************************

メソッドの宣言の行を取得したいがその方法がわかりません。
そもそもJavassistで可能でしょうか。
まあASTをスタンドアロンでjava1.5以降も読み込めますでしょうか。

宜しくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-18 23:53
新しいバージョンのJDTを利用すれば、JDK1.5以降のASTも作成できるかと思います。
例えば今のTomcatのJSPはこれでコンパイルを行っています。

バイトコードから行番号を取得するというのは、
あくまでメソッド内のインストラクション(ステートメント)単位です。
情報として持っていない上、宣言箇所が知りたいのであれば、
先に申し上げたように、抽象メソッドではそもそも持っていないため、
取得は無理かと思います。

引用:

目的:javaファイルの行数からその行のを含むメソッド名を取得する(実行ファイルではない)


目的というより、実際には何かの目的のための手段ですよね。
taka
会議室デビュー日: 2008/03/22
投稿数: 9
投稿日時: 2008-12-19 00:21
かつのりさん
毎々回答頂きありがとうございます。

さきに記述したURLにある通り最新のバージョンのASTParserをスタンドアロンで利用できませんでした。プラグインとしては可能(?)(スタンドアロンでASTParser利用できるものはjava1.5に未対応)

>目的というより、実際には何かの目的のための手段ですよね。

厳密に申しますと確かにその通りですがその他の手段はありません。(この点の詳細はお伝えすることができません。)


メソッドの宣言部の行はその宣言メソッド内としたく、
どのメソッドにも含まれない行はその旨が判断できれば良いのですが。。。


ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-12-19 01:23
http://d.hatena.ne.jp/asin/489471356X/kokosabu-22

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

ちょっと難しそうだけどこれを読み解けば class ファイルフォーマットが
わかりそう。

http://d.hatena.ne.jp/YasuyukiMiura/20081207/1228616596
元ネタはこちら。

クラスファイルからアウトライン解析するのであればこの資料を基に逆コンパイラ
は作れそうな予感です。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-19 01:50
引用:

新しいバージョンのJDTを利用すれば、JDK1.5以降のASTも作成できるかと思います。
例えば今のTomcatのJSPはこれでコンパイルを行っています。


これは完全にコンパイル目的でしか使っていないようですね。
Tomcatのlibに含まれるJDTは若干今のAPIとは違うようです。
失礼しました。

SunのJDK6ならば、tools.jarにCompiler Tree APIが含まれています。
com.sun.source.treeで始まるパッケージです。
これが一番お手軽ではないでしょうか。

引用:

メソッドの宣言部の行はその宣言メソッド内としたく、
どのメソッドにも含まれない行はその旨が判断できれば良いのですが。。。


クラスファイルに埋め込まれている情報は、
デバッガやスタックトレース向けに埋め込まれている情報ですので、
やはりそういう目的ならば、ソースコードからの解析しか方法はなさそうですね。
1

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