(57)【要約】【課題】  織り込まれるアスペクトの処理を、アスペクトによるポイントカット、アドバイスの指定に基づき、対象となるプログラムの処理のソースコード周辺に表示し、アスペクトが織り込まれるプログラムの最終的な処理全体の流れを容易に追跡することができるアスペクト表示システムを提供すること。【解決手段】  アプリケーション開発者が選択したコンピュータプログラムのソースコードを読み込み、読み込んだソースコードに対応するクラス名をメソッドテーブルから取得し、そのクラスに属するメソッド情報を取得する。そして、アスペクト情報からメソッド情報に合致する織り込み対象メソッドを検索し、それに紐付く織り込み処理を取得し、メソッド情報と対応する織り込み処理のソースコード上での行番号情報を用いて、織り込み対象メソッドの周辺に、対応する織り込み処理のソースコードを挿入または置換して表示装置に表示する。【選択図】  図１
2007213498.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムに織り込まれるアスペクトを前記コンピュータプログラムのソースコード中に表示するアスペクト表示システムであって、
コンピュータプログラムのソースコードとコンパイル済み実行可能コードと、アスペクト指向プログラミングによるアスペクトプログラムのソースコードとコンパイル済み実行可能コードを読み込む読込み手段と、
前記コンピュータプログラムのコンパイル済み実行可能コードを解析し、前記コンピュータプログラムに属する手続き定義を識別する情報と、前記手続き定義の開始命令と終了命令に対応する前記コンピュータプログラムの開始ソースコード行、終了ソースコード行を取得し、記憶手段に格納するコード解析手段と、
前記アスペクトプログラムのコンパイル済み実行可能コードを解析し、前記アスペクトプログラムに属する織り込み箇所定義を識別する情報と、前記織り込み箇所定義に定義される文字列に基づき、織り込み対象手続きの情報を検出し、前記織り込み箇所定義に紐付く織り込み手続き定義を識別する情報と、前記織り込み手続きの開始命令と終了命令に対応する前記アスペクトプログラムの開始ソースコード行、終了ソースコード行を取得するアスペクト解析手段と、
前記コンピュータプログラムのソースコードを選択し、選択された前記コンピュータプログラムに属する手続き定義を識別する情報に合致する、前記織り込み対象手続きの情報を検索し、合致した前記織り込み対象手続きが属する織り込み箇所定義を識別する情報に紐付く前記織り込み手続き定義を識別する情報を取得し、その織り込み手続き定義の前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行、前記終了ソースコード行の周辺に、挿入または置換して表示する表示制御手段と
を備えることを特徴とするアスペクト表示システム。
【請求項２】
前記アスペクト解析手段は、前記織り込み対象手続きの実行直前に前記織り込み手続きを織り込むことを意味する第１の情報を前記織り込み手続き定義を識別する情報に含めて取得し、
前記表示制御手段は、前記第１の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行の直前に挿入して表示することを特徴とする請求項１に記載のアスペクト表示システム。
【請求項３】
前記アスペクト解析手段は、前記織り込み対象手続きの実行直後に前記織り込み手続きを織り込むことを意味する第２の情報を前記織り込み手続き定義を識別する情報に含めて取得し、
前記表示制御手段は、前記第２の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記終了ソースコード行の直後に挿入して表示することを特徴とする請求項１に記載のアスペクト表示システム。
【請求項４】
前記アスペクト解析手段は、前記織り込み対象手続きを前記織り込み手続きに置き換えることを意味する第３の情報を前記織り込み手続き定義を識別する情報に含めて取得し、
前記表示制御手段は、前記第３の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行と前記終了ソースコード行の処理と置き換えて表示することを特徴とする請求項１に記載のアスペクト表示システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アスペクト指向プログラミング（ＡＯＰ：Ａｓｐｅｃｔ−Ｏｒｉｅｎｔｅｄ Ｐｒｏｇｒａｍｍｉｎｇ）に関し、対象プログラムに対して織り込まれるアスペクトの処理を、対象プログラム中の織り込み位置の処理に対応するソースコードの周辺に表示するシステムに関する。
【背景技術】
【０００２】
アスペクト指向プログラミングとは、プログラム内に分散する共通処理を、独立したモジュール（これをアスペクトと呼ぶ）に分離し、コンパイル時または実行時に結合（これを織り込みと呼ぶ）してプログラムを構築するプログラミング方式である。
例えば、オブジェクト指向プログラミングは、関連するデータの集合とそれに対する手続き（メソッド）をひとつのまとまりとして、それをクラスと呼ばれる単位のモジュールで設計し、その組み合わせによってプログラムを構成するプログラミング方式である。そのため、クラスをまたがる共通処理は各クラス／メソッドに分散してその呼び出し処理を実装する必要がある。
これに対し、アスペクト指向プログラミングでは、共通処理を一つのアスペクトとしてクラスとは別に記述し、アスペクトの処理側からアスペクトの処理を織り込むクラス／メソッドを指定する。これにより、各クラスに対し共通処理の呼び出しを記述する必要がなくなる。
アスペクト指向プログラミングの適用例としてよく挙げられるプログラムのロギングの例を用いて、上記をより具体的に説明する。
【０００３】
図１３は、与えられた２つの文字列形式の２つの数字を、整数値に変換し、加算して標準出力に出力するＪａｖａ(登録商標）のプログラムの例である。
このプログラムで定義されているCalcクラスに属する全てのメソッド実行の前後でログ出力するには、オブジェクト指向プログラミングの場合、Calcクラスの全てのメソッドの開始直後、終了直前にログ出力を行う命令文を記述しなければならない。
【０００４】
これに対し、アスペクト指向プログラミングでは、図１４に示すようにアスペクトを記述する。図１４は、Ｊａｖａにおける代表的なアスペクト指向プログラミング実装であるＡｓｐｅｃｔＪによる、メソッド実行の開始と終了でログ出力を行うアスペクトの記述例である。
アスペクトの処理は、"Aspect"アノテーション（注釈）を付加したクラスで表現し、クラス名がアスペクトの処理の識別子となる。
アノテーションとは、クラス、メソッドなどのプログラムの要素に意味づけをする注釈情報であり、@で開始する文字列がアノテーションの種別を表し、種別に続く括弧内の文字列がアノテーションの値を表す。アノテーションの情報は、コンパイルされたクラスファイルに保持され、ＪａｖａのＡＰＩを使用することでプログラム中から参照することができる。
【０００５】
アスペクトの処理は、ポイントカット（"Pointcut"アノテーションを付加したメソッド）と、アドバイス（"Before"、"After"アノテーションを付加したメソッド、それぞれBeforeアドバイス、Afterアドバイスと呼ぶ）で構成する。それぞれ、"Pointcut"アノテーションを付加したメソッド名がポイントカットの識別子、"Before"、"After"アノテーションを付加したメソッドがアドバイスの識別子となる。
ポイントカットは、アスペクトの処理を織り込む対象クラス／メソッドの位置を記述するもので、"Pointcut"アノテーションの値に、「ポイントカット種別(ジョインポイント)」の形式で指定する。
ジョインポイントは、アスペクトの処理を織り込むメソッドを記述するもので、パターン文字列を指定することができる。
パターンは、「返値の型△クラス名.メソッド名(引数の型)」（△は空白）の形式で構成される。図１４の例では、「* Calc.*(..)」というパターン１４０１が指定され、Calcクラスの全てのメソッドが織り込み対象であることを示している。
なお、パターンは、「*」を指定すると「△」、「.」を除いた任意の文字列にマッチする。また、「..」という文字列を指定すると、任意の文字列にマッチする。
【０００６】
ポイントカット種別は、ジョインポイントで指定されたメソッドに対する振る舞いを記述するものである。図１４の例では、「execution」１４００が指定され、ジョインポイントで指定されたメソッドに対してアスペクトの処理を織り込むことを示している。
アドバイスは、織り込む処理そのものと、ポイントカットで定義された織り込み位置に対してどのタイミングで処理を実行するかを記述するものである。図１４の例では、"Before"アノテーションの値にポイントカットの識別子である「anyExecution()」１４０２を指定することで、anyExecution()ポイントカットとBeforeアドバイスを紐付け、anyExecution()ポイントカットで指定されたメソッドを実行する前にbeforeDebugメソッドの処理を織り込むことを示している。同様にAfterアドバイスは、ポイントカットで指定されたメソッドを実行した後に「afterDebug」メソッドの処理を織り込むことを示している。
【０００７】
図１３、図１４のクラスをコンパイルすると、anyExecution()ポイントカットに合致するCalcクラスの全てのメソッドの実行の直前にBeforeアドバイスの処理が、直後にAfterアドバイスの処理が織り込まれたクラスが生成される。
このように、Ｊａｖａでは各クラスに分散して呼び出しを記述する必要があった共通処理を、アスペクト指向プログラミングでは独立したモジュールとして記述することができ、プログラム作成のコスト増加、プログラムの保守性の低下といった問題を解決している。
なお、本発明に関する公知技術文献としては下記の特許文献１が挙げられる。
【０００８】
【特許文献１】特開２００５−２５８９４４
【０００９】
特許文献１では、アスペクト指向プログラミングによるプログラムのデータの依存関係および制御依存関係の情報を取得し、プログラムに対するアスペクトの織り込み箇所からデータの依存関係および制御依存関係を辿ってアスペクトの織り込みによる影響の波及経路を探索し、プログラムのソースコードの構文解析の結果と得られたアスペクトの影響の波及経路とに基づいて、プログラムにおけるアスペクトの織り込みの影響を受ける箇所を検出し、織り込み対象となるプログラムのソースコードに検出箇所を表示している。
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかし、上述したようにアスペクト指向プログラミングでは、織り込み箇所をアスペクトの処理側から指定するため、織り込み対象となる処理のソースコードからは、どのようなアスペクトが織り込まれるかを知ることができず、アスペクト側から織り込み対象のクラスを探し、追跡しなければ、最終的に生成される処理全体の把握することができない。
特許文献１の解析・表示方法においてもソースコード上にアスペクトの織り込み箇所と、それに依存するデータ、制御の依存関係を表示することで、織り込んだアスペクトが元のプログラムに影響を及ぼす範囲を把握することが可能ではあるが、アスペクトの処理内で実行される織り込み元に依存しない処理に関しては言及されておらず、プログラムの最終的な処理全体を追跡することはできていない。
また、織り込み箇所に表示されるアスペクトの名前から該当するアスペクトを参照することで、プログラムの最終的な処理全体を追跡することは可能ではあるが、追跡の際に、織り込み対象の処理のソースコードと複数のアスペクトの処理のソースコードの両方を参照しながら追跡する必要があり、織り込み対象の処理のソースコード上だけで、織り込まれるアスペクトの処理も含めた最終的な処理の流れを追跡することはできていない。
【００１１】
本発明は、上述のような課題に鑑みてなされたものであり、その目的は、織り込まれるアスペクトの処理を、アスペクトによるポイントカット、アドバイスの指定に基づき、対象となるプログラムの処理のソースコード周辺に表示し、アスペクトが織り込まれるプログラムの最終的な処理全体の流れを容易に追跡することができるアスペクト表示システムを提供することにある。
【課題を解決するための手段】
【００１２】
上記目的を達成するために、本発明のアスペクト表示システムは、コンピュータプログラムに織り込まれるアスペクトを前記コンピュータプログラムのソースコード中に表示するアスペクト表示システムであって、
コンピュータプログラムのソースコードとコンパイル済み実行可能コードと、アスペクト指向プログラミングによるアスペクトプログラムのソースコードとコンパイル済み実行可能コードを読み込む読込み手段と、前記コンピュータプログラムのコンパイル済み実行可能コードを解析し、前記コンピュータプログラムに属する手続き定義を識別する情報と、前記手続き定義の開始命令と終了命令に対応する前記コンピュータプログラムの開始ソースコード行、終了ソースコード行を取得し、記憶手段に格納するコード解析手段と、前記アスペクトプログラムのコンパイル済み実行可能コードを解析し、前記アスペクトプログラムに属する織り込み箇所定義を識別する情報と、前記織り込み箇所定義に定義される文字列に基づき、織り込み対象手続きの情報を検出し、前記織り込み箇所定義に紐付く織り込み手続き定義を識別する情報と、前記織り込み手続きの開始命令と終了命令に対応する前記アスペクトプログラムの開始ソースコード行、終了ソースコード行を取得するアスペクト解析手段と、前記コンピュータプログラムのソースコードを選択し、選択された前記コンピュータプログラムに属する手続き定義を識別する情報に合致する、前記織り込み対象手続きの情報を検索し、合致した前記織り込み対象手続きが属する織り込み箇所定義を識別する情報に紐付く前記織り込み手続き定義を識別する情報を取得し、その織り込み手続き定義の前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行、前記終了ソースコード行の周辺に、挿入または置換して表示する表示制御手段とを備えることを特徴とする。
また、前記アスペクト解析手段は、前記織り込み対象手続きの実行直前に前記織り込み手続きを織り込むことを意味する第１の情報を前記織り込み手続き定義を識別する情報に含めて取得し、前記表示制御手段は、前記第１の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行の直前に挿入して表示することを特徴とする。
また、前記アスペクト解析手段は、前記織り込み対象手続きの実行直後に前記織り込み手続きを織り込むことを意味する第２の情報を前記織り込み手続き定義を識別する情報に含めて取得し、前記表示制御手段は、前記第２の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記終了ソースコード行の直後に挿入して表示することを特徴とする。
また、前記アスペクト解析手段は、前記織り込み対象手続きを前記織り込み手続きに置き換えることを意味する第３の情報を前記織り込み手続き定義を識別する情報に含めて取得し、前記表示制御手段は、前記第３の情報に基づき、前記織り込み手続きの前記開始ソースコード行から前記終了ソースコード行の間の織り込み処理を、対応する前記コンピュータプログラムに属する手続き定義の前記開始ソースコード行と前記終了ソースコード行の処理と置き換えて表示することを特徴とする。
【発明の効果】
【００１３】
本発明のアスペクト表示システムによれば、織り込み対象の処理のソースコードと複数のアスペクトの処理のソースコードの両方を参照せずに、従来のメソッドの処理の追跡同様、織り込み対象の処理のソースコード上だけで、織り込まれるアスペクトの処理も含めた最終的な処理の流れを容易に追跡することが可能になる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明の実施の形態を図面を参照して詳細に説明する。
図１は、本発明の実施の形態を示すシステム構成図である。
本実施形態のアスペクト表示システムは、計算機１０１と、計算機１０１に接続された記憶装置１０２と、計算機１０１に搭載されたアスペクト表示プログラム１０３とで構成される。
計算機１０１は、表示装置１０４、入力装置としてキーボード１０５とマウス１０６を備える。
表示装置１０４には、アスペクト表示プログラム１０３の画面が表示され、キーボード１０５とマウス１０６によってアスペクト表示プログラム１０３を操作する。
記憶装置１０２には、アプリケーションソースコード１０７と、アプリケーションソースコード１０７をコンパイルして生成されたアプリケーションクラス１０８と、アスペクトソースコード１０９と、アスペクトソースコード１０９をコンパイルして生成されたアスペクトクラス１１０が格納されている。
【００１５】
アスペクト表示プログラム１０３は、記憶装置１０２に格納されているアプリケーションソースコード１０７、アプリケーションクラス１０８、アスペクトソースコード１０９、アスペクトクラス１１０を読み込むファイル読込部１１１と、アプリケーションクラス１０８のバイトコードを走査し、メソッドテーブルを生成するバイトコード解析部１１２と、アスペクトクラス１０９のバイトコードを走査し、アスペクト情報を生成するアスペクト解析部１１３と、生成されたメソッドテーブルとアスペクト情報からアスペクトの織り込み位置を算出し、アプリケーションソースコード上に展開し、表示装置１０４に表示する表示制御部１１４で構成される。
【００１６】
図２は、アスペクト解析部１１３によって生成されるアスペクト情報のデータ形式の例である。
アスペクト情報２０１は、アスペクト識別子２０２、ポイントカット情報２０３、アドバイス情報２０４で構成される。
アスペクト情報２０１の各行は、１行が１つのアスペクトクラス１１０から抽出した情報であることを示す。
アスペクト識別子２０２は、Aspectアノテーションが付加されたクラス名で、各アスペクトクラス１１０を一意に識別するための識別子である。
ポイントカット情報２０３は、ポイントカット識別子２０５、ポイントカット種別２０６、織り込み位置２０７で構成される。
【００１７】
ポイントカット情報の各行は、１行がアスペクトクラス１１０内の１つのポイントカット定義から抽出した情報であることを示す。
ポイントカット識別子２０５は、Pointcutアノテーションが付加されたメソッド名で、各ポイントカットを一意に識別するための識別子である。
ポイントカット種別２０６は、Pointcutアノテーションの値に定義されたポイントカット種別である。
織り込み位置２０７は、返値の型２０８、クラス２０９、メソッド２１０、シグニチャ２１１、行番号（開始）２１２、行番号（終了）２１３で構成される。
織り込み位置２０７の各行は、１行が、Pointcutアノテーションの値に定義されたパターンに合致するアプリケーションクラス１０８の１つのメソッドの情報を表している。
返値の型２０８は、パターンに合致するメソッドの返値の型である。
クラス２０９は、パターンに合致するメソッドが所属するクラス名である。
メソッド２１０は、パターンに合致するメソッド名である。
シグニチャ２１１は、パターンに合致するメソッドの引数の型である。
行番号（開始）２１２、行番号（終了）２１３は、それぞれパターンに合致するメソッドの開始・終了のバイトコードに対応するソースコードの行番号である。
【００１８】
アドバイス情報２０４は、アドバイス種別２１４、アドバイス識別子２１５、参照ポイントカット識別子２１６、行番号（開始）２１７、行番号（終了）２１８で構成される。
アドバイス情報の各行は、一行がアスペクトクラス１１０内のアドバイス定義から抽出した情報であることを示す。
アドバイス種別２１４は、アドバイスの種類を判別するためのもので、アドバイスにBeforeアノテーションが付加されているBeforeアドバイスの場合は「Before」、Afterアノテーションが付加されているAfterアドバイスの場合は「After」、Aroundアノテーションが付加されているAroundアドバイスの場合は「Around」の文字列が格納される。
Beforeアドバイスは、織り込み位置２０７で示されるメソッドが実行される前にアドバイス処理を実行し、Afterアドバイスは、メソッドが実行された後にアドバイス処理を実行し、Aroundアドバイスはメソッドの実行をアドバイス処理に置き換えて実行する。
アドバイス識別子２１５は、Before、After、Aroundのいずれかのアノテーションが付加されたメソッド名で、各アドバイスを一意に識別するための識別子である。
参照ポイントカット識別子２１６は、Before、After、Aroundのいずれかのアノテーションの値に定義された、ポイントカットとアドバイスを紐付けるための識別子である。
行番号（開始）２１７、行番号（終了）２１８は、それぞれBefore、After、Aroundのいずれかのアノテーションが付加されたメソッドの開始・終了のバイトコードに対応するソースコードの行番号である。
【００１９】
図３は、バイトコード解析部１１２によって生成されるメソッドテーブルのデータ形式の例である。
メソッドテーブルは、クラス名３０１とメソッド情報３０２で構成される。
クラス名３０１の各行は、１行が１つのアプリケーションクラス１０８から抽出した情報であることを示す。
クラス名３０１は、アプリケーションクラス１０８のクラス名である。
メソッド情報３０２は、返値の型３０３、メソッド３０４、シグニチャ３０５、行番号（開始）３０６、行番号（終了）３０７から構成される。
返値の型３０３は、アプリケーションクラス１０８に定義されているメソッドの返値の型である。
メソッド３０４は、アプリケーションクラス１０８に定義されているメソッドの名前である。
シグニチャ３０５は、アプリケーションクラス１０８に定義されているメソッドの引数の型である。
行番号（開始）３０６、行番号（終了）３０７は、それぞれアプリケーションクラス１０８に定義されているメソッドの開始・終了のバイトコードに対応するソースコードの行番号である。
【００２０】
図４は、Ｊａｖａのプログラム定義方法を使用して定義した、与えられた２つの文字列形式の２つの数字を、整数値に変換し、加算して標準出力に出力する、織り込み対象となるアプリケーションクラスのソースコード１０７の例である。
数字４０１は、ソースコードの行番号を示している。以下に説明する図５、図６、図７、図８、図９、図１０も同様である。
【００２１】
図５は、ＡｓｐｅｃｔＪのプログラム定義方法を使用して定義した、Beforeアドバイスが記述されたアスペクトのソースコード１０９の例である。
Aspectアノテーション５０１は、図５のソースコードがアスペクトクラスであることを示すアノテーションである。
クラス名５０２は、アスペクトクラスの名前である。
Pointcutアノテーション５０３は、アノテーションに紐付くメソッドが、ポイントカット定義であることを示すアノテーションである。
値５０４は、Pointcutアノテーション５０３の値であり、ポイントカット種別５０５とパターン５０６で構成される。
ポイントカット種別５０５は、織り込み対象のメソッドに対する振る舞いを示すものである。
パターン５０６は、織り込み対象のメソッドを指定する定義である。
メソッド名５０７は、ポイントカット定義を識別するための識別子である。
Beforeアノテーション５０８は、アノテーションに紐付くメソッドが、織り込み対象のメソッドの直前に織り込まれるアドバイス処理であることを示すアノテーションである。
値５０９は、アドバイス処理をPointcutアノテーションと紐付けるための識別子である。
メソッド名５１０は、アドバイス処理を識別するための識別子である。
アドバイス処理５１１は、織り込まれるアドバイス処理である。
図５では、Pointcutアノテーション５０３の値５０４のパターン５０６によって、CalcクラスのsetXメソッドを織り込み対象のメソッドとして指定している。そして、ポイントカット種別５０５によって、織り込み対象のメソッドに対してアドバイス処理を織り込むことを指定している。そして、Beforeアノテーション５０８の値５０９によって、メソッド名５１０をPointcutアノテーション５０３と紐付け、setXメソッドの実行前にアドバイス処理５１１を織り込むように指定していることを示している。
【００２２】
図６は、図５のアスペクトのソースコードに記述されたアドバイス処理５１１を、Pointcutアノテーション５０３で指定された織り込み位置に表示した、表示制御部１１４の表示画面の例である。
表示６０１は、setXメソッドの実行前にアドバイス処理５１１を実行することを示している。
【００２３】
図７は、ＡｓｐｅｃｔＪのプログラム定義方法を使用して定義した、Afterアドバイスが記述されたアスペクトのソースコード１０９の例である。
Pointcutアノテーション７０１によって、CalcクラスのsetYメソッドを織り込み対象のメソッドとして指定している。
そして、Afterアノテーション７０２によってアドバイス処理７０３をPointcutアノテーション７０１と紐付け、setYメソッドの実行後にアドバイス処理７０３を織り込むように指定している。
【００２４】
図８は、図７のアスペクトのソースコードに記述されたアドバイス処理７０３を、Pointcutアノテーション７０１で指定された織り込み位置に表示した、表示制御部１１４の表示画面の例である。
表示８０１は、setYメソッドの実行後にアドバイス処理７０３を実行することを示している。
【００２５】
図９は、ＡｓｐｅｃｔＪのプログラム定義方法を使用して定義した、Aroundアドバイスが記述されたアスペクトのソースコード１０９の例である。
Pointcutアノテーション９０１によって、Calcクラスのaddメソッドを織り込み対象のメソッドとして指定している。
そして、Aroundアノテーション９０２によってアドバイス処理９０３をPointcutアノテーション９０１と紐付け、addメソッドの処理をアドバイス処理９０３に置き換えて織り込むように指定している。
【００２６】
図１０は、図９のアスペクトのソースコードに記述されたアドバイス処理９０３を、Pointcutアノテーション９０１で指定された織り込み位置に表示した、表示制御部１１４の表示画面の例である。
表示１００１は、addメソッドの処理をアドバイス処理９０３で置き換えて実行することを示している。
なお、アドバイス処理内でJoinPointクラスのproceedメソッドが呼び出されている場合は、アドバイス処理内から織り込み対象の処理を呼び出すことを意味し、図１０ではproceedメソッドの呼び出しを織り込み対象の処理（すなわちaddメソッドの処理に）に置き換えて表示することで表現している。
【００２７】
以下、本発明の実施の形態の処理手順を図１１、図１２に示すフローチャートを用いて説明する。
図１１において、ステップ１１０１で、アプリケーション開発者は、アプリケーションとアスペクトのソースコードを記述し、記憶装置１０２に、それぞれアプリケーションソースコード１０７、アスペクトソースコード１０９として保存する。
アプリケーションソースコード１０７、アスペクトソースコード１０９は、テキストエディタやソフトウェア開発ツールに含まれるソースコードエディタなど、ソースコードを作成することができる任意のエディタで記述して構わない。
図４は、本ステップで作成したアプリケーションソースコード１０７の例を示しており、図５、図７、図９は本ステップで作成したアスペクトソースコード１０９の例を示している。
【００２８】
次に、ステップ１１０２で、アプリケーション開発者は、アプリケーションソースコード１０７とアスペクトソースコード１０９をそれぞれコンパイルし、アプリケーションクラス１０８とアスペクトクラス１１０を生成し、記憶装置１０２に保存する。
図４のアプリケーションソースコードはＪａｖａコンパイラを用いてコンパイルし、図５、図７、図９のアスペクトソースコードはＡｓｐｅｃｔＪコンパイラを用いてコンパイルする。
次に、ステップ１１０３で、ファイル読込部１１１によって、未処理のアプリケーションクラス１０８を１つ読み込む。
【００２９】
続くステップ１１０４で、バイトコード解析部１１２によって、ファイル読込部１１１が読み込んだアプリケーションクラス１０８を解析し、図３のメソッドテーブルを生成する。
本例では、図４のアプリケーションソースコードをコンパイルしたアプリケーションクラス１０８を、「The Java Virtual Machine Specification Second Edition」(http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html)の「3.1 The Class File Format」に示されるＪａｖａバイトコード仕様に基づき、アプリケーションクラス１０８のクラス名を抽出しクラス名３０１としてメソッドテーブルに格納し、更にクラスに属するメソッドの、返値の型、メソッド名、メソッドシグニチャ、メソッド開始のバイトコードに対応する行番号、メソッド終了のバイトコードに対応する行番号を取得し、それぞれ返値の型３０３、メソッド３０４、シグニチャ３０５、行番号（開始）３０６、行番号（終了）３０７に格納する。
【００３０】
次に、ステップ１１０５で、メソッドテーブルをまだ作成していない未処理のアプリケーションクラス１０８が存在するかどうか判定し、未処理のアプリケーションクラスが存在する場合は、ステップ１１０３に戻り、処理を繰り返す。
全てのアプリケーションクラスを処理した場合には、ステップ１１０６に進む。
ステップ１１０６で、ファイル読込部１１１により、未処理のアスペクトクラス１１０を１つ読み込む。
【００３１】
続くステップ１１０７で、アスペクト解析部１１３によって、ファイル読込部１１１が読み込んだアスペクトクラス１１０からAspectアノテーション５０１が定義されたクラス名５０２を抽出し、図２のアスペクト情報２０１のアスペクト識別子２０２に格納する。
本例では、図５のアスペクトソースコードをコンパイルしたアスペクトクラス１１０に対し、ＪａｖａのリフレクションＡＰＩ（クラス、フィールド、メソッド、アノテーション等に関する情報を抽出する機能）を用いて、Aspectアノテーションが定義されたクラス名であるBeforeLoggingAspectを抽出し、アスペクト識別子２０２に格納する。
【００３２】
次に、ステップ１１０８で、アスペクト解析部１１３は、読み込んだアスペクトクラス１１０から未処理のPointcutアノテーション定義５０３と、同アノテーションに紐付くメソッド名５０７を取得する。メソッド名５０７は、ポイントカット識別子２０５としてポイントカット情報に格納する。そして、Pointcutアノテーション５０３の値５０４からポイントカット種別５０５を取得し、ポイントカット種別２０６としてポイントカット情報２０３に格納する。
本例では、ステップ１１０７と同様に、ＪａｖａのリフレクションＡＰＩを使用してアノテーション、メソッドを抽出する。
【００３３】
次に、ステップ１１０９で、アスペクト解析部１１３は、ステップ１１０８で取得したPointcutアノテーションの値５０４からパターン５０６を取得し、パターンに合致する織り込み対象のクラス、メソッドのクラス名、メソッド情報をメソッドテーブルから取得し、クラス名を織り込み位置２０７のクラス２０９に格納し、メソッド情報の返値の型３０３、メソッド３０４、シグニチャ３０５、行番号（開始）３０６、行番号（終了）３０７を、織り込み位置２０７の返値の型２０８、メソッド２１０、シグニチャ２１１、行番号（開始）２１２、行番号（終了）２１３にそれぞれ格納する。
図５の例では、「* Calc.setX(..)」というパターンに、CalcクラスのsetX(int x)メソッドが合致し、そのメソッド情報を織り込み位置２０７に格納している。
【００３４】
次に、ステップ１１１０で、未処理のポイントカット定義が存在するかどうかを判定し、未処理のポイントカット定義が存在する場合は、ステップ１１０８に戻り、処理を繰り返す。全てのポイントカット定義を処理した場合には、ステップ１１１１に進む。
ステップ１１１１で、アスペクト解析部１１３は、読み込んだアスペクトクラス１１０から未処理のアドバイス定義を示すアノテーション（Before、After、Aroundアノテーションのいずれか）と、同アノテーションに紐付くメソッド名５１０を取得する。
そして、取得したアノテーションがBeforeアノテーションの場合は、「Before」、Afterアノテーションの場合は「After」、Aroundアノテーションの場合は「Around」という文字列をアドバイス種別２１４としてアドバイス情報２０４に格納する。そして、メソッド名５１０は、アドバイス識別子２１５としてアドバイス情報２０４に格納する。また、アノテーションの値５０９を参照ポイントカット識別子２１６としてアドバイス情報２０４に格納し、アドバイス情報２０４とポイントカット情報２０３を紐付ける。
【００３５】
続くステップ１１１２で、アスペクト解析部１１３は、読み込んだアスペクトクラス１１０を解析し、メソッド名５１０のメソッド開始のバイトコードに対応する行番号、メソッド終了のバイトコードに対応する行番号を取得し、それぞれアドバイス情報２０４の行番号（開始）２１７と行番号（終了）２１８に格納する。
本例では、ステップ１１０４と同様にＪａｖａバイトコード仕様に基づいて解析を行う。
【００３６】
次に、ステップ１１１３で、未処理のアドバイス定義が存在するかどうかを判定し、未処理のアドバイス定義が存在する場合は、ステップ１１１１に戻り、処理を繰り返す。全てのアドバイス定義を処理した場合には、ステップ１１１４に進む。
ステップ１１１４では、未処理のアスペクトクラス１１０が存在するかどうかを判定し、未処理のアスペクトクラスが存在する場合は、ステップ１１０５に戻り、処理を繰り返す。全てのアスペクトクラスを処理した場合には、ステップ１１１５に進む。
【００３７】
ステップ１１１５では、アプリケーション開発者が選択したアプリケーションソースコード１０７をファイル読込部１１１が読み込む。
ステップ１１１６で、表示制御部１１４は、ファイル読込部１１１が読み込んだアプリケーションソースコード１０７の織り込み対象となるメソッドを検出し、その周辺に対応するアスペクトの処理（アドバイス処理）を表示する。
【００３８】
表示制御部１１４は、織り込み対象となるメソッドと対応するアスペクトの検出を図１２に示すような手順で行う。
まず、ステップ１２０１で、読み込んだアプリケーションソースコード１０７に対応するクラス名３０１をメソッドテーブルから取得する。
次に、ステップ１２０２で、取得したクラス名に属する全てのメソッド情報３０２をメソッドテーブルから取得する。
次に、ステップ１２０３で、未処理のメソッド情報３０２を１行選択する。
次に、ステップ１２０４で、ステップ１２０１で取得したクラス名、ステップ１２０３で選択したメソッド情報３０２の返値の型３０３、メソッド３０４、シグニチャ３０５と等しいクラス２０９、返値の型２０８、メソッド２１０、シグニチャ２１１を持つ織り込み位置を全て取得する。
【００３９】
次に、ステップ１２０５で、取得した織り込み位置のうち未処理のものを１行選択する。
次に、ステップ１２０６で、選択した織り込み位置行が属するポイントカット情報２０３に紐付けられているアドバイス情報を取得する。
そして、ステップ１２０７で、ステップ１２０３で選択したメソッド情報行の行番号（開始）３０６、行番号（終了）３０７と、ステップ１２０６で取得したアドバイス情報行の行番号（開始）２１７、行番号（終了）２１８を用いて、アプリケーションソースコード１０７の織り込み対象メソッドの周辺にアドバイス処理を表示する。
ステップ１２０６で取得したアドバイス情報行のアドバイス種別２１４が「Before」の場合には、アスペクトソースコード１０９から行番号（開始）２１７、行番号（終了）２１８を用いて、織り込まれるアスペクト処理のソースコードを抽出し、アプリケーションソースコード１０７の行番号（開始）３０６の位置に挿入して表示する。
【００４０】
アドバイス種別２１４が「Before」の場合の、表示制御部１１４の表示画面は図６で示したものである。
アドバイス種別２１４が「After」の場合には、アスペクトソースコード１０９から行番号（開始）２１７、行番号（終了）２１８を用いて、織り込まれるアスペクト処理のソースコードを抽出し、アプリケーションソースコード１０７の行番号（開始）３０６の位置にｔｒｙ節を挿入し、行番号（終了）３０７の位置にｆｉｎａｌｌｙ節に囲まれたアスペクト処理を挿入して表示する。
アドバイス種別２１４が「After」の場合の、表示制御部１１４の表示画面は図８に示したものである。
【００４１】
アドバイス種別２１４が「Around」の場合には、アスペクトソースコード１０９から行番号（開始）２１７、行番号（終了）２１８を用いて、織り込まれるアスペクト処理のソースコードを抽出し、アプリケーションソースコード１０７の行番号（開始）３０６から行番号（終了）３０７までの処理を、アスペクト処理で置き換えて表示する。更に、アスペクト処理のソースコード中に、置き換え元の処理を呼び出す命令（本例の場合はJoinPointクラスのproceed()メソッド）が存在する場合は、その命令を置き換え元の処理に置き換えて表示する。
アドバイス種別２１４が「Around」の場合の、表示制御部１１４の表示画面は図１０に示したものである。
【００４２】
次に、ステップ１２０８で、未処理の織り込み位置が存在するかどうかを判定し、存在する場合はステップ１２０５に戻り処理を繰り返す。存在しない場合はステップ１２０９に進む。
最後に、ステップ１２０９で、未処理のメソッド情報が存在するかどうかを判定し、存在する場合はステップ１２０３に戻り処理を繰り返す。存在しない場合は処理を終了する。
【００４３】
以上の処理によって、織り込まれるアスペクトの処理は、織り込み対象メソッドの周辺に挿入、または織り込み対象メソッドを置換して、表示装置１０４に表示される。
これにより、織り込み対象の処理のソースコードと複数のアスペクトの処理のソースコードの両方を参照せずに、従来のメソッドの処理の追跡同様、織り込み対象の処理のソースコード上だけで、織り込まれるアスペクトの処理も含めた最終的な処理の流れを容易に追跡することが可能になる。
【図面の簡単な説明】
【００４４】
【図１】本発明に係わるアスペクト表示システムの実施の形態を示すシステム構成図である。
【図２】ポイントカット情報のデータ形式の例を示す図である。
【図３】メソッドテーブルのデータ形式の例を示す図である。
【図４】織り込み対象となるアプリケーションクラスのソースコードの例を示す図である。
【図５】Beforeアドバイスを持つアスペクトクラスのソースコードの例を示す図である。
【図６】図５のBeforeアドバイスを持つアスペクト織り込み時の表示例を示す図である。
【図７】Afterアドバイスを持つアスペクトクラスのソースコードの例を示す図である。
【図８】図７のAfterアドバイスを持つアスペクト織り込み時の表示例を示す図である。
【図９】Aroundアドバイスを持つアスペクトクラスのソースコードの例を示す図である。
【図１０】図９Aroundアドバイスを持つアスペクト織り込み時の表示例を示す図である。
【図１１】実施形態における全体の手順を説明するためのフローチャートである。
【図１２】織り込み対象メソッドと対応するアスペクト処理の検出、表示手順を説明するためのフローチャートである。
【図１３】織り込み対象となるＪａｖａプログラムの例を示す図である。
【図１４】ＡｓｐｅｃｔＪによるアスペクトの記述例を示す図である。
【符号の説明】
【００４５】
１０１  計算機
１０２  記憶装置
１０３  アスペクト表示プログラム
１０７  アプリケーションソースコード
１０８  アプリケーションクラス
１０９  アスペクトソースコード
１１０  アスペクトクラス
１１２  バイトコード解析部
１１３  アスペクト解析部
１１４  表示制御部
２０１  アスペクト情報
２０３  ポイントカット情報
２０７  織り込み位置
２０４  アドバイス情報
３０１  メソッドテーブル
【図１】
2007213498.tif 000003
【図２】
2007213498.tif 000004
【図３】
2007213498.tif 000005
【図４】
2007213498.tif 000006
【図５】
2007213498.tif 000007
【図６】
2007213498.tif 000008
【図７】
2007213498.tif 000009
【図８】
2007213498.tif 000010
【図９】
2007213498.tif 000011
【図１０】
2007213498.tif 000012
【図１１】
2007213498.tif 000013
【図１２】
2007213498.tif 000014
【図１３】
2007213498.tif 000015
【図１４】
2007213498.tif 000016