(57)【要約】      （修正有）【課題】本発明の課題は、Ｊａｖａ言語プログラムを用いた大規模業務系の保守作業の負担を著しく軽減できるツールを提供する。【解決手段】Ｊａｖａ言語プログラムのクラスファイルからクラス情報、メソッド情報及び参照先メソッド情報を抽出し、クラス情報から、オブジェクト化される具象クラスを探し、該具象クラスのＩＤと同一のオブジェクトＩＤを生成すると共に、オブジェクトＩＤを特定できなかった場合は、関連元の具象クラス・メソッドが属するツリー状に階層化された構造の先頭のクラスのクラス・メソッドＩＤを探索し、該先頭のクラス・メソッドＩＤからオブジェクトＩＤを探し、参照先メソッド情報及びオブジェクトＩＤをキー情報として具象クラス・メソッドＩＤと、該具象クラス・メソッドＩＤの関連先である具象クラス・メソッドＩＤの組み合わせを検索して、該クラス・メソッドに関連する一連の具象クラス・メソッドを抽出して画面に表示する。【選択図】図１１−２
2008134699.tif 000002
【特許請求の範囲】
【請求項１】
ツリー状に階層化されたＪａｖａ言語プログラムのクラスファイルからクラス情報、メソッド情報及び参照先メソッド情報を抽出する第１の手段と、
抽出したクラス情報から、オブジェクト化される具象クラスを探し、該具象クラスのＩＤと同一のＩＤであるオブジェクトＩＤを生成する第２の手段と、
前記第２の手段によりオブジェクトＩＤを特定できなかった場合は、関連元の具象クラス・メソッドが属する前記ツリー状に階層化された構造の先頭のクラスのクラス・メソッドＩＤ（文脈ＩＤ）を探索し、該先頭のクラスのクラス・メソッドＩＤ（文脈ＩＤ）に基づいて該オブジェクトＩＤを求める第３の手段と、
前記クラスファイルから抽出した参照先メソッド情報、前記オブジェクトＩＤおよび前記文脈ＩＤをキー情報として、具象クラスＩＤ及び具象メソッドＩＤよりなる具象クラス・メソッドＩＤと、該具象クラス・メソッドＩＤの関連先である具象クラス・メソッドＩＤの組み合わせを検索して関連元具象クラス・メソッドＩＤと関連先具象クラス・メソッドのペア情報を生成する第４の手段と、
所望のクラス・メソッドを指定し、該クラス・メソッドに関連する一連の具象クラス・メソッドを抽出して画面に表示する第５の手段よりなることを特徴とするＪａｖａ言語プログラムの分析ツール。
【請求項２】
請求項１において、前記第４の手段は、オブジェクトＩＤと、該オブジェクトＩＤに属する具象クラス・メソッドＩＤとの関係を表す第１のテーブルを作成する手段を有することを特徴とする分析ツール。
【請求項３】
請求項１において、前記第４の手段は、オブジェクトＩＤと、該オブジェクトＩＤに属する抽象クラスＩＤ及びインターフェースＩＤとの関係を表す第２のテーブルを作成する手段を有することを特徴とする分析ツール。
【請求項４】
請求項１において、前記第４の手段は、オブジェクト化される具象クラスのＩＤ（被生成クラスＩＤ）と、オブジェクトの生成クラスのＩＤ（生成クラスＩＤ）との関係を表す第３のテーブルを作成する手段を有することを特徴とする分析ツール。
【請求項５】
請求項１において、前記第４の手段は、インターフェース又は抽象クラスのクラスＩＤと、抽象メソッドのメソッドＩＤとよりなる抽象クラス・メソッドＩＤと、該抽象クラス・メソッドＩＤが属する具象クラス・メソッドＩＤとの関係を示す第４のテーブルを作成する手段とを含むことを特徴とする分析ツール。
【請求項６】
請求項１において、前記第４の手段は、参照元クラス・メソッドＩＤと、該参照元クラス・メソッドＩＤが属するオブジェクトＩＤと、参照先クラス・メソッドＩＤと、該参照先クラス・メソッドＩＤが属するオブジェクトＩＤとの関係を表す第５のテーブルを作成する手段を含むことを特徴とする分析ツール。
【請求項７】
請求項６において、前記第３の手段は、前記第５のテーブルのテーブルレコード番号と、前記参照元クラス・メソッドを参照先とする先頭のクラス・メソッドである文脈クラス・メソッドのＩＤとの関係を表す第６のテーブルを作成する手段を含むことを特徴とする分析ツール。
【請求項８】
請求項７において、前記第３の手段は、前記文脈クラス・メソッドＩＤと、該文脈クラス・メソッドＩＤの配下にある一連のクラスの中の被生成クラスのＩＤとの関係を表す第７のテーブルを作成する手段を含むことを特徴とする分析ツール。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｊａｖａ（登録商標）言語プログラムの分析ツールに関し、特にＪａｖａ言語プログラムを用いた大規模業務系の影響分析ツールに関する。なお、Ｊａｖａは米Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃの登録商標である。
【背景技術】
【０００２】
例えば証券業務などのような大規模業務系においては、従来、ＣＯＢＯＬ言語プログラムが一般に用いられている。そして保守効率を上げるために、プログラムは処理目的毎に分類され、階層化された構造を有するのが一般的である。また、プログラムが階層化された構造であることを前提とした構造解析ツール類も充実しており、これらのツールを使うことによって、効率的にシステムの保守を行うことができる。
【０００３】
ところで最近は、大規模業務系の再構築に当たり、使用言語をＣＯＢＯＬからＪａｖａに置き換える例が増えている。
【０００４】
ＣＯＢＯＬ言語に比べて、Ｊａｖａ言語は生産性、拡張性及び適用性に優れているため、オープンシステムの開発用に広く用いられているが、保守作業効率において後述のような様々な問題があるため、非常に限られた条件の中でしか使用されていないのが実状である。
【０００５】
以下、まずＪａｖａ言語の概要について述べ、次に大規模業務システムの開発にＪａｖａ言語プログラムを用いた場合の課題について述べる。
【０００６】
（１）Ｊａｖａ言語の概要
Ｊａｖａ言語のプログラムは、複数のクラスの組み合わせにより成り立っている。クラスとは、データと処理とをまとめたものと言える。つまりＪａｖａ言語では、関連するデータや処理をまとめたクラスという部品を作っておき、それらを自由に組み合わせたり、再利用して複雑なプログラムを作成する。クラスを構成するデータをフィールド、処理をメソッドと言い、フィールドやメソッドをクラスのメンバと称する。
【０００７】
クラスはプログラムコードであり、これを実際にコンピュータで実行するためには、オブジェクトを生成しなければならない。オブジェクトとは、プログラムコードであるクラスが、コンピュータメモリ上に実行可能な状態に存在している場合のクラスに対する呼称である。クラスからオブジェクトを生成することをインスタンス化又はオブジェクト化という。
【０００８】
フィールドとは、クラス内の変数（データ）であり、メソッドとは、データの操作方法（処理）を定義したものである。処理の対象となる値を引数（パラメータ）といい、処理の結果の値のことを戻り値（返り値）という。
【０００９】
Ｊａｖａ言語プログラムの拡張性及び適用性が優れている一つの理由は、クラスの継承という仕組みがあるからである。クラスの継承とは、クラスがほかのクラスのメンバを受け継ぐ機能である。例えば、クラスＡのメンバをクラスＢが受け継ぐことができる。継承する元となるクラスをスーパークラス（親クラス）、継承して作ったクラスをサブクラス（子クラス）という。
【００１０】
またＪａｖａ言語では、クラスに対するアクセス方法を定義したインターフェースと称されるものが使用される。インターフェースはクラスと似たものであるが、定数と、後述の抽象メソッドしかメンバになれないところがクラスとは異なる。
【００１１】
クラスは、抽象クラスと具象クラス及びインターフェースに分類される。抽象クラスは、通常のクラスにインターフェースの機能を付加したものであり、具象クラスは、実際のプログラムコードを記述し、インスタンス化可能としたものである。インターフェースと抽象クラスは、そのままではインスタンス化することはできない。つまり、抽象クラス、具象クラス、インターフェースのうちで、オブジェクトコードを生成できるのは具象クラスのみである。
【００１２】
一方メソッドも、抽象メソッドと具象メソッドに分類される。抽象メソッドとは、メソッドの名前、戻り型、引数だけを定義し、ロジック（処理の内容）は定義していないものをいう。この抽象メソッドはインターフェースと、抽象クラスにおいて定義される。具象メソッドは、メソッドの名前、戻り型、引数及びロジックを定義したもので、抽象クラス又は具象クラスで定義される。参照先の具象メソッドを実装メソッド、実装メソッドを有するクラスを実装クラスと称することもある。
【００１３】
次に、Ｊａｖａ言語を用いて記述されたプログラムを図１−１を用いて説明する。
【００１４】
図の１００，３００，４００は具象クラス、２００はインターフェースの一例を示す。具象クラス１００は、Ｕｓｅｒｃｌａｓｓという名前を有する。そのクラスは、ｕｓｒｍｄｔというメソッドを有する。そのメソッドは、参照先がＩＳｔｒａｔｅｇｙというインターフェースであることを示している。
【００１５】
一方、インターフェース２００は、ＩＳｔｒａｔｅｇｙという名称を有し、ｔｃという抽象メソッドを含んでいる。
【００１６】
また具象クラス３００は、ｃｌａｓｓＡという名称を有し、ｔｃという具象メソッドを有する。具象クラス３００はオブジェクトを生成しているので実装クラスと称される。具象クラス１００は、インターフェース２００を介して別の具象クラス３００と関連付けられるので、本明細書では、１００を関連元クラス、３００を関連先クラスという。
【００１７】
図１−２は、図１−１のように記述されたプログラムのクラス間の関係を表わすクラス図である。クラス１００はインターフェース２００を参照し、クラス３００はクラス４００を参照している。また、クラス３００はインターフェース２００を継承しているので、５００で示す記号を用いて表示される。
【００１８】
図１−３は、オブジェクト同士の関係を示すシーケンス図である。前述のように、具象クラス、抽象クラス及びインターフェースのうちでオブジェクトを生成できるのは具象クラスだけである。この図は、クラス１００，３００，４００のオブジェクト１００´，３００´，４００´の関係を示している。クラス１００，３００，４００のオブジェクトは一般に、別のクラスにより生成される。各オブジェクト１００´，３００´，４００´を生成しているクラスを生成クラスと称し、クラス１００，３００，４００を被生成クラスと称する。
【００１９】
次に、一つのクラスに含まれる情報について説明する。
【００２０】
図１−４は、一つのクラスに含まれる情報とその関連を示す図である。１つのクラスには、クラス情報１０、メソッド情報２０、データ情報６０及びメソッド間の関連を示す情報３０が含まれる。
【００２１】
クラス情報１０には、クラスＩＤ１１、クラス名１２、スーパークラス名（親クラス名）１３、インターフェース名１４が含まれる。また、メソッド情報２０には、メソッドＩＤ２１、メソッド名２２、メソッドの型（具象タイプ、抽象タイプ）２３、引数２４及び引数の型２５の情報が含まれる。
【００２２】
メソッド間関連情報３０としては、メソッド２１が参照するメソッド３１、参照するメソッドのメソッド名３２、参照メソッドの引数のタイプ３３が含まれる。参照先メソッド３１は、ｓｔａｔｉｃ修飾子のついたメソッド３４、インターフェースのメソッド３５、コンストラクタという特殊なメソッド３６及びその他のメソッド３７の４種類に分類される。コンストラクタはオブジェクトの生成のときに自動的に呼び出されるメソッドであり、ｓｔａｔｉｃメソッドは、どのオブジェクトでも動作を同じにする特殊なメソッドである。
【００２３】
インターフェース３５には、インターフェース名４１とメソッド型４２の情報が含まれ、その他のクラス３７にも同様に、参照先のクラス３８とメソッドの型３９の情報が含まれる。またｓｔａｔｉｃメソッド３４には、参照先クラス４０の情報が含まれる。
【００２４】
当該クラス１０でオブジェクトを生成する場合は、そのオブジェクトを生成する対象となったクラス５０の情報であるクラス名５１が含まれる。
【００２５】
一方、クラス１０のフィールドに関する情報６０として変数名６１、変数を参照する場合の参照先クラス６２、変数の型６３等の情報が含まれる。
【００２６】
（２）Ｊａｖａ言語プログラムを大規模業務系に用いた場合の問題点
Ｊａｖａ言語は多数のクラスの組み合わせにより成り立っているため、生産性に優れ、また、システムを拡張するのに適した言語でもある。しかしながらシステムを保守する場合には、以下説明するような数々の問題がある。
【００２７】
証券業務システム等の大規模事務系のプログラムにＪａｖａ言語を用いると、クラス数は、例えば数万個から数１０万個、メソッド数は数１０万個から数１００万個に達する膨大なものとなる。
【００２８】
このようなシステムにおいて、何らかの不具合が発生した場合は、その不具合の原因となったクラスやメソッドを特定しなければならない。また、特定されたクラスやメソッドを修正したときに、影響を受ける一連のクラスやメソッドを把握する必要もある。
【００２９】
また、システムに新たな機能を追加するためにクラスを追加や修正する場合も同様に、追加や修正したクラスやメソッドにより影響を受ける一連のクラスやメソッドを把握する必要がある。
【００３０】
このような保守業務の効率化を図るために、ＣＯＢＯＬ言語を用いた場合と同様に、Ｊａｖａ言語を用いたプログラムも、数万〜数１０万のクラスは業務の処理目的毎に分類され、階層化された構造とされるのが一般的である。そしてＪａｖａプログラムの保守においては、図１−２に例示したクラス図や、図１−３に例示したシーケンス図を用い、これらにソースコード分析を加えることによってクラスやメソッドを特定したり、特定のクラスやメソッドと関連のある一連のクラスやメソッドを把握している。
【００３１】
しかしながらＪａｖａ言語プログラムは、不具合の発生したクラス、メソッドを特定したり、特定したクラス、メソッドに関連性のある一連のクラス、メソッドを把握することが困難な構造を有するため、保守業務においてプログラム開発者への負担が非常に大きい。
【００３２】
この問題を解決するために本発明者は、先にＪａｖａ言語プログラムを、クラス・メソッドを単位として捉え、具象クラス・メソッド単位の流れとして把握することが可能な分析ツールを提案した（特願２００６−３０６５２５参照）。
【００３３】
図１−５は、Ｊａｖａ言語プログラムを、クラス・メソッドを単位として捉えた場合の処理の流れを例示したものである。
【００３４】
この図は、最上位階層のクラスＣ１１のメソッドＭ２が次の階層のクラスＣ２１のメソッドＭ４を参照し、クラスＣ２１のメソッドＭ４が次の階層のクラスＣ３１のメソッドＭ５を参照し、以下点線で示す参照関係がある例を示している。また同様に、クラスＣ１１のメソッドＭ４がクラスＣ２２のメソッドＭ１を参照し、クラスＣ２２のメソッドＭ１がクラスＣ３１のメソッドＭ５を参照している例を示している。
【００３５】
前述のクラス図（図１−２）は単に、クラスＣ１１，Ｃ２１，Ｃ２２・・・の関連を示すだけであるため、保守業務に当たり、メソッド単位の詳細な処理の流れを調べるためには、プログラム開発者がソースコードを分析して把握せざるを得なくなる。
【００３６】
ここで、各クラスのＩＤは、Ｃ１１，Ｃ２１，Ｃ２２・・・で表し、システムの中でユニークに（一意的に）特定できるコードが割り当てられ、各メソッドはＭ１，Ｍ２，Ｍ３・・・のように、各クラス内においてユニークに特定できるコードが割り当てられる。従って、クラスＩＤ＋メソッドＩＤ（以下これをクラス・メソッドＩＤという）により、システム内の全てのメソッドをユニークに特定することができる。
【００３７】
それ故、システムを構成するＪａｖａ言語プログラム内で実質的な処理に関与している（すなわちオブジェクトを生成している）全てのクラス・メソッドＩＤの関連を表すことができれば、所望のメソッドを特定したり、そのメソッドに関連する一連のクラス・メソッドを把握することができる。
【００３８】
本発明者は、数１０万〜数１００万に及ぶ全てのクラス・メソッドの中で、具象メソッドのみを抽出し、それらの関連を、クラス・メソッドＩＤを用いて表すことを試みた。しかし、コンピュータの能力を遥かに超える程膨大な処理になり、理論上は可能であっても、事実上は極めて困難であることが判った。その原因の一つは、Ｊａｖａ言語では、クラスがインターフェースや抽象クラスを参照したり、クラス間の継承と呼ばれる処理が頻繁に行われることによる。
【００３９】
次に、継承の一例について、図１−６を用いて説明する。
【００４０】
図１−６は、クラス２００がクラス１００を継承し、クラス３００がクラス２００を継承する例を示している。クラス１００にはクラスＩＤのＣ１１と、メソッドＩＤのｍ１が定義され、クラス２００にはクラスＩＤのＣ２１とメソッドＩＤのｍ２が定義され、クラス３００にはクラスＩＤのＣ３１とメソッドＩＤのｍ３が定義されていると仮定する。ソースコードプログラム上で、このクラス・メソッドＩＤのＣ１１ｍ１，Ｃ２１ｍ２，Ｃ３１ｍ３を継承の手法を用いて記述すると、実際にはＣ１１ｍ１〜Ｃ３１ｍ３の６個のクラス・メソッドＩＤが定義されたことになる。
【００４１】
つまり、ソースコードプログラム上はＣ２１ｍ１，Ｃ３１ｍ１，Ｃ３１ｍ２は隠された状態となる。従って、全ての具象クラス・メソッドＩＤの関連を調べるには、このように隠されているクラス・メソッドも含めた、全てのクラス・メソッド関連を調べなければならない。
【００４２】
また、具象クラス同士がインターフェースや抽象クラスを介在した複雑な参照関係にある場合も、全てのクラス・メソッドの参照先を追跡して、オブジェクトの生成に関与している具象クラス・メソッドの関連を調べることが必要となる。従って、これらの隠蔽クラスも含めて、全ての具象クラス・メソッド間の関連を調べるためには膨大な処理量が発生する。しかしながら従来のツールには、クラス隠蔽及びメソッド隠蔽された箇所の分析機能がなく、また妥当な具象メソッドだけを導出する機能もないため、プログラムの保守が極めて困難になる。
【００４３】
また、図１−３に例示したように、オブジェクト１００´，３００´，４００´の流れを示すシーケンス図も用いられるが、シーケンス図を作成する既存ツールは、継承関係やインターフェースが介在した関連の先を追跡した分析ができないため、シーケンス図を用いてもプログラム開発者の負担はそれ程小さくならない。
【００４４】
更に、従来の分析ツールはクラス図、シーケンス図を表示できるとは言え、一画面に表示できるクラス数、オブジェクト数は１０数個程度が限界であり、膨大な数のクラス・メソッド関連を把握することはできないため、これもプログラムの保守を困難にする一つの理由となっている。
【００４５】
先願の特願２００６−３０６５２５においては、オブジェクト化される具象クラスと同一のＩＤであるオブジェクトＩＤという概念を導入し、オブジェクトＩＤの情報に基づいて関連元の具象クラス・メソッドＩＤと、関連先のクラス・メソッドＩＤとのペア情報を生成している。
【００４６】
この方法によれば具象クラス同士がインターフェースや抽象クラスを介在した参照関係にある場合も、ペア情報を生成することができるが、クラスやメソッドが隠される態様によっては、関連先の具象クラス・メソッドＩＤを特定できない場合もある。
【発明の開示】
【発明が解決しようとする課題】
【００４７】
本発明の目的は、上記のような従来の問題点を解決し、Ｊａｖａ言語プログラムを用いた大規模業務システムにおける保守作業の負担を著しく軽減することができるツールを提供することにある。
【００４８】
具体的には、本発明は、クラスの継承によりソースコードプログラム上では隠されたクラスに属する具象メソッドも含めて、具象クラス・メソッド間の関連を表示できるツールを提供することにある。
【００４９】
本発明の他の目的は、インターフェースまたは抽象クラスにより隠蔽された具象クラス・メソッドと、その関連を表示することが可能なツールを提供することにある。
【００５０】
本発明の他の目的は、クラスが機能的に分類され、階層化された構造のプログラムにおいて、ある分類に属する全ての具象クラス・メソッドと、その関連を表示することが可能なツールを提供することにある。
【００５１】
本発明の他の目的は、クラスが機能的に分類され、階層化された構造のプログラムにおいて、所望の具象クラス・メソッドを特定したときに、その特定された具象クラス・メソッドに関連する一連の具象クラス・メソッドを表示できるツールを提供することにある。
【００５２】
本発明の他の目的は、実装済みの資源を基に、リバースエンジニアリングによって設計書を生成し、設計書を保守するコストを大幅に削減すると同時に、設計書と実装の乖離を起こさないようにするツールを提供することにある。
【課題を解決するための手段】
【００５３】
上記の目的を達成するために本発明に係る分析ツールは、ツリー状に階層化されたＪａｖａ言語プログラムのクラスファイルからクラス情報、メソッド情報及び参照先メソッド情報を抽出する第１の手段と、抽出したクラス情報から、オブジェクト化される具象クラスを探し、該具象クラスのＩＤと同一のＩＤであるオブジェクトＩＤを生成する第２の手段と、前記第２の手段によりオブジェクトＩＤを特定できなかった場合は、関連元の具象クラス・メソッドが属する前記ツリー状に階層化された構造の先頭のクラスのクラス・メソッドＩＤを探索し、該先頭のクラスのクラス・メソッドＩＤに基づいて該オブジェクトＩＤを求める第３の手段と、前記クラスファイルから抽出した参照先メソッド情報及び前記オブジェクトＩＤをキー情報として、具象クラスＩＤ及び具象メソッドＩＤよりなる具象クラス・メソッドＩＤと、該具象クラス・メソッドＩＤの関連先である具象クラス・メソッドＩＤの組み合わせを検索して関連元具象クラス・メソッドＩＤと関連先具象クラス・メソッドのペア情報を生成する第４の手段と、所望のクラス・メソッドを指定し、該クラス・メソッドに関連する一連の具象クラス・メソッドを抽出して画面に表示する第５の手段より構成したことに一つの特徴を有する。
【００５４】
本発明の他の特徴は、前記第４の手段は、オブジェクトＩＤと、該オブジェクトＩＤに属する具象クラス・メソッドＩＤとの関係を表す第１のテーブルを作成する手段を備えていることにある。
【００５５】
本発明の他の特徴は、前記第４の手段は、オブジェクトＩＤと、該オブジェクトＩＤに属する抽象クラスＩＤ及びインターフェースＩＤとの関係を表す第２のテーブルを作成する手段を備えていることにある。
【００５６】
本発明の他の特徴は、前記第４の手段は、オブジェクト化される具象クラスのＩＤ（被生成クラスＩＤ）と、オブジェクトの生成クラスのＩＤ（生成クラスＩＤ）との関係を表す第３のテーブルを作成する手段を備えていることにある。
【００５７】
本発明の他の特徴は、前記第４の手段は、インターフェース又は抽象クラスのクラスＩＤと、抽象メソッドのメソッドＩＤとよりなる抽象クラス・メソッドＩＤと、該抽象クラス・メソッドＩＤが属する具象クラス・メソッドＩＤとの関係を示す第４のテーブルを作成する手段を備えていることにある。
【００５８】
本発明の他の特徴は、前記第４の手段は、参照元クラス・メソッドＩＤと、該参照元クラス・メソッドＩＤが属するオブジェクトＩＤと、参照先クラス・メソッドＩＤと、該参照先クラス・メソッドＩＤが属するオブジェクトＩＤとの関係を表す第５のテーブルを作成する手段を備えたことにある。
【００５９】
本発明の他の特徴は、前記第３の手段は、前記第５のテーブルのテーブルレコード番号と、前記参照元クラス・メソッドを参照先とする先頭のクラス・メソッドである文脈クラス・メソッドのＩＤとの関係を表す第６のテーブルを作成する手段を備えたことにある。
【００６０】
本発明の他の特徴は、前記第３の手段は、前記文脈クラス・メソッドＩＤと、該文脈クラス・メソッドＩＤの配下にある一連のクラスの中の被生成クラスのＩＤとの関係を表す第７のテーブルを作成する手段を備えたことにある。
【発明の効果】
【００６１】
本発明によれば、次のような効果が得られる。
【００６２】
（１）Ｊａｖａ言語プログラムを、クラス間の関連よりも更に詳細なクラス・メソッド間の関連として画面上で把握することが可能となる。クラス・メソッド間の関連は、オブジェクトを生成しないインターフェースや抽象クラスを除いた具象クラス・メソッド間の関連として把握することができ、且つクラス隠蔽により、ソースコードプログラム上では隠蔽されたクラス・メソッドも表示することができる。
【００６３】
（２）具象クラス・メソッドＩＤを単位としてその関連を把握できるので、あるクラスのあるデータ項目にアクセスするクラス・メソッドを特定したり、当該データ項目が利用されている一連のクラス・メソッドを特定することが可能となる。
【００６４】
（３）具象クラス・メソッドを対象としたクラス・メソッドを単位として、その関連を把握できるので、階層構造のＪａｖａ言語プログラムにおいて、あるクラス・メソッドが他のクラス・メソッドに及ぼす範囲を特定したり、一つのトランザクションに用いられる全てのクラス・メソッドを特定し、画面上に表示することが可能となる。
【００６５】
（４）オブジェクトの関連を示す従来のシーケンス図を作成するツールでは、隠蔽メソッドへの関連より先の具象メソッドへの関連を分析することができないが、本発明ツールにおいては、隠蔽メソッドの先の具象メソッドへの関連も分析し、画面上に表示することが可能となる。
【００６６】
上記の（１）〜（４）により、大規模業務系のＪａｖａ言語プログラムの保守作業の負担を著しく軽減することが可能になる。
【００６７】
（５）設計書をリバースエンジニアリングで生成することにより、人手で設計書を保守する工数を大幅に低減することができる。
【００６８】
（６）人手で設計書を保守すると、設計書と実装との乖離を起こし易いが、リバースエンジニアリングで生成することによって、実装との乖離を起こさない。
【発明を実施するための最良の形態】
【００６９】
以下、本発明に係る分析ツールの概要をまず説明し、次にその一実施形態を図面を参照して説明する。
【００７０】
本発明は、具象クラス・メソッド間の関連を調べるのに、クラスＩＤとメソッドＩＤの他にオブジェクトＩＤという概念を導入し、これらのＩＤを基にして隠されたクラス及び隠蔽されたクラスも含めて、具象クラス・メソッドと、その具象クラス・メソッドが参照する具象クラス・メソッドとの関係を求めて表示できるようにしたツールにおいて、更に文脈クラス・メソッドＩＤという概念を導入することにより、具象クラス・メソッド間の参照関係をより高精度に探索できるようにしたものである。
【００７１】
本発明ツールにより、具象クラス・メソッドの関連情報を表示する手順は次のとおりである。
（１）Ｊａｖａプログラムの各クラスファイルからクラス情報、メソッド情報、及び参照先メソッド情報を抽出する。
（２）抽出した情報をＤＢに登録する。
（３）登録された情報を基にしてオブジェクトＩＤ情報を生成する。
（４）クラスＩＤ、メソッドＩＤ及びオブジェクトＩＤを基にして、参照元の具象クラス・メソッドＩＤと、参照先の具象クラス・メソッドＩＤの関連情報を生成する。
（５）文脈クラス・メソッドＩＤを用いて、（４）では特定できないオブジェクトＩＤを探索する。
（６）具象クラス・メソッドの関連情報を表示する。
【００７２】
以下、これらの具体的内容を順に説明する。
【００７３】
（１）Ｊａｖａプログラムからの情報抽出
Ｊａｖａプログラムから、図１−４に例示したクラス情報１０、メソッド情報２０及び参照先情報３０を抽出するために、まずクラスファイルを生成し、次にクラスファイルを分析する。
【００７４】
（１．１）クラスファイル生成
クラスファイルとは、Ｊａｖａソースコードプログラムを構成する各クラスをコンパイルすることにより生成されたファイルである。例えばＪａｖａソースコードプログラムの各クラスは、図２−１に例示されるように記述されており、これをコンパイルすると、図２−２に例示されるような数字で記述されたものになる。大規模業務システムではクラスの数が数１０万個に達するから、その数のクラスファイルが作成されることになる。
【００７５】
このクラスファイルの中には具象ファイル、抽象クラス及びインターフェースのファイルが含まれる。
【００７６】
（１．２）ファイル分析
次に、このクラスファイルを分析して４種類の情報を抽出する。図３−１に示すクラス情報、図３−２に示すメソッド情報、図３−３に示すスーパークラス情報、及び図３−４に示すメソッド関連情報である。
【００７７】
従来、ソースコードプログラムからクラス情報やメソッド情報を抽出する試みはあるが、本発明においては更にメソッド関連情報を抽出したことに一つの特徴がある。
【００７８】
クラス情報には、具象クラス、抽象クラス及びインターフェースのクラスＩＤ、クラス名、パッケージ名、スーパークラス名、スーパークラスパッケージ名及びクラスの種類の情報が含まれる。
【００７９】
パッケージとは、複数のクラスやインターフェースをひとまとめにしたものである。またスーパークラスとは、継承する元となったクラス、つまり親クラスであり、継承して作ったクラスをサブクラス（子クラス）という。クラスの種類は、そのクラスが具象クラス、抽象クラス及びインターフェースの３種類に分類する情報である。
【００８０】
メソッド情報には、図３−２に示すように、クラスＩＤ、メソッドＩＤ、メソッド名、引数及び戻り値の情報、コンストラクタ、メソッドの種類などの情報が含まれる。メソッドＩＤは、各クラスＩＤの中で一義的に定められるＩＤである。コンストラクタとは、オブジェクトの生成をするときに自動的に呼び出される特殊なメソッドである。
【００８１】
スーパークラス情報には、図３−３に示すように、子クラスＩＤと親クラス名との関係、及びクラスＩＤとインターフェース名との関係を表す情報が含まれる。
【００８２】
メソッド関連情報には、図３−４に示すように、クラスＩＤ、メソッドＩＤの他に、一意キーＩＤ（図３−４のレコードを一意的（ユニーク）に特定するＩＤ）、参照先のクラス名、参照先のメソッド名が含まれる。また参照先クラスが具象クラス、インターフェース、抽象クラスのいずれに属するかを示す参照先クラス情報も含まれる。
【００８３】
図３−５は、クラスファイルから上記のクラス情報、メソッド情報、スーパークラス情報及びメソッド関連情報を抽出するフローを示す。
【００８４】
ステップＳ４０１において、図２−１に例示したクラスファイルを１件読み込む。続いて、クラス項目の記述からクラス名称の情報を取り出し（Ｓ４０２）、更にクラス種類の情報を取り出す（Ｓ４０３）。
【００８５】
ステップＳ４０４では、ｅｘｔｅｎｄｓの項目値を全部取り出す。ｅｘｔｅｎｄｓは継承を定義する記号であり、例えば
ｃｌａｓｓ  Ａ  ｅｘｔｅｎｄｓ  Ｂ
という記述は、サブクラス（子クラス）Ａがスーパークラス（親クラス）Ｂを継承したことを表す。また、インターフェースに対してｅｘｔｅｎｄｓの記号を用いる場合は、拡張インターフェース（子インターフェース）がそのインターフェース（親インターフェース）を継承したことを表す。
【００８６】
ステップＳ４０５では、ｉｍｐｌｅｍｅｎｔｓ項目値を全部取り出す。ｉｍｐｌｅｍｅｎｔｓは実装を定義する記号であり、例えば
ｃｌａｓｓ  Ｃ  ｉｍｐｌｅｍｅｎｔｓ  Ｄ
と記述すると、例えばインターフェースＤをクラスＣが実装することを表す。
【００８７】
ステップＳ４０６では、読み込んだクラスファイルのクラス種類がインターフェースかクラスかを判定する。クラスの場合はｅｘｔｅｎｄｓの項目に記述されたクラス（上記のＤ）をスーパークラス名称とし（Ｓ４０７）、また、ｉｍｐｌｅｍｅｎｔｓの項目値（上記のＤ）をインターフェース名称とする（Ｓ４０８）。
【００８８】
一方、ステップＳ４０６でインターフェースと判定された場合、ｅｘｔｅｎｄｓ項目値を拡張インターフェース名称とする（Ｓ４０９）。
【００８９】
次に、ステップＳ４１０〜Ｓ４１９において、メソッドに関する情報を抽出する。まず、クラスファイルからメソッド名称を取り出し（Ｓ４１２）、更に戻り値（処理の結果の値）の型名（例えば整数型）及び引数（処理の対象となる変数、パラメータ）の型名称を順次取り出す（Ｓ４１３，Ｓ４１４）。
【００９０】
ステップＳ４１５でメソッド名称がクラス名称に等しいか否か判断し、等しい場合、上記メソッドはオブジェクトの生成のときに呼び出されるコンストラクタというメソッドであると判断する（Ｓ４１６）。
【００９１】
ステップＳ４１５の判定がＮＯのときは、メソッド中に処理ロジックが存在するか否か判定する（Ｓ４１７）。処理ロジックが存在すれば具象メソッドと判断し（Ｓ４１８）、処理を記述せずに、単に呼び出した方だけを定義したメソッドは抽象メソッドと判断する（Ｓ４１９）。このようにして、図３−２に示したメソッド情報が抽出される。
【００９２】
次に、ステップＳ４２０〜Ｓ４２７によりメソッド関連情報を抽出する。ステップＳ４２０において、メソッド本体の処理ロジック中に記述された参照先のメソッド情報を検索する。ステップＳ４２１で未処理のメソッドがあるか否か判定し、ある場合はステップＳ４２２に進み、参照先メソッドのメソッド名称を取り出す。また、ステップＳ４２３において、参照先メソッドが属するクラスのクラス名称をそれぞれ取り出す。
【００９３】
次に、処理ロジックの引数がレジスタ変数か否かを判定し（Ｓ４２４）、レジスタ変数の場合は、ロジックを遡って、レジスタ変数に値を代入している箇所から引数の型名称（例えば整数型）を取り出す（Ｓ４２５）。またステップＳ４２４の判定がＮＯの場合は、参照先メソッドの引数の型名称を順次取り出す（Ｓ４２６）。また、参照先メソッドを呼び出すオペランドから参照先がインターフェースか、或いはクラスかを判断する（Ｓ４２７）。
【００９４】
このように本発明は、クラス情報及びメソッド情報だけでなく、参照先のクラス及びメソッドの情報をも抽出する。そして得られた情報は、図３−６に例示するＸＭＬファイルとして整理される。
【００９５】
（２）抽出情報のＤＢ投入
上記のようにして抽出された情報は、ＤＢに投入される。図４−５は、ＤＢ投入のフローを示すもので、ステップＳ５０１において、前述のＸＭＬファイルにより各クラス毎のレコードが読み込まれ、ステップＳ５０２でクラスに関する情報が、図４−１に例示するクラス情報テーブルＴ１００に登録される。またステップＳ５０３では、メソッドに関する情報が、図４−２に例示するメソッド情報テーブルＴ２００に登録される。ステップＳ５０４では、クラスのスーパークラス及びインターフェースの情報が、図４−３に例示するスーパークラス情報テーブルＴ３００に登録される。更にステップＳ５０５では、メソッド関連情報が、図４−４に例示するメソッド関連情報テーブルＴ４００に登録される。このようにして、数万〜数１０万個の全クラスの情報が、全てＤＢに投入される（Ｓ５０６）。
【００９６】
（３）オブジェクトＩＤ情報の生成
まず、オブジェクトＩＤという新しい概念を導入することによって、具象クラス・メソッド間の関連情報を探索する仕組みについて説明する。
【００９７】
簡単な例として、図５−１に示すように、具象クラスＡ，Ｂ，ＣとインターフェースＩＡ，ＩＢがあり、ＩＡをＩＢが継承し、クラスＢ及びＣがインターフェースＩＢを継承している場合を考える。説明の便宜上、Ａ，Ｂ，Ｃ・・・はクラスの名称と、クラスＩＤの両方を指称するものとし、クラス・メソッドＩＤは、例えばＡａ，ＩＡｍのように表すものとする。
【００９８】
オブジェクトＩＤは、オブジェクト化される具象クラスに対して付与される。この例では、具象クラスＡ，Ｂ，Ｃがインスタンス情報を生成するクラスに相当するので、各クラスＡ，Ｂ，ＣにクラスＩＤと同一のオブジェクトＩＤのＡ，Ｂ，Ｃが付与される。すなわち、オブジェクトＩＤはクラスＡ，Ｂ，Ｃのオブジェクトの生成クラス（生成クラス）ではなく、オブジェクト化されるクラス（被生成クラス）のクラスＩＤと同じコードとされる。なお説明の便宜上、ここではオブジェクトＩＤが付与されると記述するが、実際には、オブジェクトＩＤとクラス・メソッドとの対照表あるいはオブジェクトＩＤとインターフェースの対照表が作成される。また、クラス・メソッドＩＤがＡａとＡｂのように、同じクラスに属する異なるメソッドにも同一のＡというオブジェクトＩＤが付与される。
【００９９】
一方、インターフェースＩＡ，ＩＢはインスタンス化されないので、継承関係にある具象クラスのオブジェクトＩＤが付与される。図５の例では、インターフェースＩＡ、ＩＢは具象クラスＢと継承関係にあるのでＢというオブジェクトＩＤが付与されると同時に、具象クラスＣとも継承関係にあるのでＣというオブジェクトＩＤも付与される。すなわち、各インターフェースのクラス・メソッドＩＤに相当するＩＡｍ，ＩＢｍが、具象クラスＢのオブジェクトＩＤのＢに属するという対照表が作成されると共に、ＩＡｍ及びＩＢｎがオブジェクトＩＤのＣに属するという関係が対照表に登録される。
【０１００】
このようにして、全てのクラス・メソッドがオブジェクト化されるクラスのオブジェクトＩＤに属するという関係表が作成される。従来は、例えばＡａの関連先がＢｍであった場合、多数のクラスやインターフェースの参照関係、継承関係を追跡してＢｍを探索しなければならなかったが、本発明では、ＩＡｍ，ＩＢｎ、Ｂｍに共通のオブジェクトＩＤであるＢが付与され、ＡａがオブジェクトＩＤのＢに属するＩＡｍを参照先としているので、オブジェクトＩＤのＢを媒介情報としてＡａとＢｍとの関係をより探索しやすくなる。
【０１０１】
以上述べたオブジェクトＩＤをキー情報として、具象クラス・メソッド間の関連を探索するには、事前に次のような準備をする必要がある。
【０１０２】
第１は、オブジェクトＩＤと具象クラス・メソッドＩＤの対照表の作成である。図５の例で説明すると、クラス・メソッドＡａ，ＡｂがオブジェクトＩＤのＡに属し、クラス・メソッドＢｍがオブジェクトＩＤのＢに属することを示すテーブルである。本明細書では、このテーブルをオブジェクト情報マスターテーブルと称する。
【０１０３】
第２は、オブジェクトＩＤとインターフェースＩＤ（及び抽象クラスのＩＤ）との対照表である。図５の例で説明すると、インターフェースＩＡ，ＩＢがオブジェクトＩＤのＢに属し、同様にＩＡ，ＩＢがオブジェクトＩＤのＣにも属するという関係を示すテーブルである。本明細書では、このテーブルをオブジェクト対インターフェース情報テーブルと称する。
【０１０４】
第３は、オブジェクト化される具象クラス（被生成クラス）と、そのオブジェクトの生成クラスのＩＤとの対照表である。本明細書では、前者のクラスを被生成クラス、後者のクラスを生成クラスと称する。図５の例には示されていないが、クラスＡのオブジェクトはクラスＡ以外の別のクラス、例えばクラスＸで生成される。また、クラスＢのオブジェクトは別のクラス、例えばクラスＹで生成される。従ってこの場合は、被生成クラスＡと生成クラスＸとの関係及び被生成クラスＢと生成クラスＹとの関係を示すテーブルとなる。本明細書では、このテーブルを生成クラス情報テーブルと称する。
【０１０５】
第４は、継承関係にあるために隠蔽されている抽象メソッドを可視化する処理である。図５の例では、インターフェースＩＢがＩＡを継承しているため、クラス・メソッドＩＤとしてＩＡｍとＩＢｎしか記述されていないが、実際にはＩＢｍが隠蔽されている（図１−６参照）。継承関係にある全ての抽象クラス・メソッドＩＡｍ，ＩＢｍ，ＩＢｎがオブジェクトＩＤのＢに属するという関係を表すためには、隠蔽されている抽象メソッドも含めた全抽象メソッドを可視化する処理が必要である。本明細書では、この処理を全抽象メソッド情報登録処理と称する。
【０１０６】
第５は、具象クラス・メソッドＩＤが参照している参照先の抽象クラス・メソッドＩＤと、その抽象クラス・メソッドＩＤが属するオブジェクトＩＤ、及び同じオブジェクトＩＤに属する具象クラス・メソッドＩＤとの関係を示すテーブルである。図５の例では、クラスＡの参照先のＩＡｍと、ＩＡｍが属するオブジェクトのＩＤであるＢと、オブジェクトＢに属する具象クラスＢの具象クラス・メソッドＩＤＢｍとの関係を示すテーブルである。本明細書では、このテーブルをインターフェース対実装対応情報テーブルと称する。
【０１０７】
本発明は、以上説明したテーブルの情報に基づいて、具象クラス・メソッド間の関連情報を生成することに一つの特徴を有する。
【０１０８】
以下、第１〜第５の処理及びテーブル作成のフローについて詳しく説明する。
【０１０９】
（３．１）オブジェクト情報マスターテーブルの作成
図６−１は、オブジェクト情報マスターテーブルＴ５００に含まれる情報を示すもので、オブジェクトＩＤと、オブジェクトＩＤに属する具象クラス・メソッドＩＤの関係を示す。また、クラスに親子関係がある場合は、親・子・孫の順に番号を付けた階層番号の情報も含まれる。
【０１１０】
図６−２は、オブジェクトマスター情報テーブルを作成するフローを示す。まず、ステップＳ６０１において、クラス情報テーブルＴ１００からクラスタイプが“０”のもの、すなわち具象クラスのみのクラスＩＤを抽出して、一時テーブル（Ｔ）を作成する。ステップＳ６０２では、テーブル（Ｔ）にクラスＩＤが登録されているか否かを判定し、登録されている場合は、そのクラスＩＤを１件取り出してそのクラスＩＤをオブジェクトＩＤ（Ｏ）とする（Ｓ６０３）。
【０１１１】
次に、クラス情報テーブルＴ１００を参照して、取り出したクラスＩＤに親クラス名が設定されているか否か判断する（Ｓ６２１）。親クラス名が設定されている場合は、親クラス名をキー情報として、クラス情報テーブルＴ１００を参照して親クラスＩＤを取得する（Ｓ６２２）。そして取得したクラスＩＤを主体にして（Ｓ６２４）、再びステップＳ６２１とＳ６２２を繰り返すことにより最上位のクラスＩＤ（ＳＴ）を取得する（Ｓ６２３）。
【０１１２】
階層番号（Ｌ）として（Ｌ）＝０とし（Ｓ６０４）、（ＳＴ）を（Ｂ）に置き換えた後（Ｓ６０５）ステップＳ６０３で（Ｌ）＋１を（Ｌ）に置き換えることによって最上位の階層番号が１となる。すなわちこの実施例では、階層番号は相対的な値で、最上位の親が一番若い番号となる。
【０１１３】
次にステップＳ６０７において、メソッド情報テーブルＴ２００から、最上位のクラス（Ｂ）に属する具象メソッド（メソッド種類が“０”のクラス）のメソッドＩＤを取り出す。取り出したメソッドＩＤと、クラスＩＤ（Ｂ）のペアと、階層番号（Ｌ）と、オブジェクトＩＤ（Ｏ）を１組として、集合メモリ（Ｍ１）に格納する。
【０１１４】
この結果、オブジェクトＩＤ（Ｏ）と、そのオブジェクトＩＤを付与される最上位の親クラスに属する具象メソッドのクラス・メソッドＩＤの関連を表す情報が生成される。
【０１１５】
次にステップＳ６０８では、クラス情報テーブルＴ１００を参照して、クラスＩＤ（Ｂ）を親クラスとする子クラス（Ｃ）を検索する。ステップＳ６０９において、クラス（Ｂ）の子クラス（Ｃ）が存在すると判定された場合は、Ｃ→Ｂと置き換えて、ステップＳ６０６〜Ｓ６０９を繰り返す。この結果、親子関係にある全てのクラスのクラス・メソッドＩＤに対してオブジェクトＩＤ（Ｏ）が付与される。
【０１１６】
ステップＳ６１１では、オブジェクトＩＤ（Ｏ）と、そのオブジェクトＩＤ（Ｏ）に属する具象クラス・メソッド及びクラスの階層の情報がオブジェクト情報マスターテーブルＴ５００に書き込まれる。その後、具象クラスＩＤの一時テーブル（Ｔ）から取り出した１件のクラスＩＤを削除する（Ｓ６１２）。そして次の１件のクラスＩＤを取り出し、クラスＩＤがなくなるまで繰り返して行われる。この結果、クラス情報テーブルＴ１００の全ての具象クラス・メソッドに対し、オブジェクトＩＤが付与されたことになる。
【０１１７】
（３．２）オブジェクト対インターフェース情報テーブルの作成
図７−１は、オブジェクト対インターフェース情報テーブルＴ６００に含まれる情報を示すもので、オブジェクトＩＤ（被生成クラスのクラスＩＤ）とそのオブジェクトＩＤを付与された抽象クラスのＩＤ及びインターフェースのＩＤの情報を含む。
【０１１８】
図７−２は、オブジェクト対インターフェース情報テーブルＴ６００を作成するフローを示す。
【０１１９】
まずステップＳ６３１において、オブジェクト情報マスターテーブルＴ５００に登録されているオブジェクトＩＤ（Ｏ）を全件抽出する。次にステップＳ６３２において、オブジェクトＩＤ（Ｏ）の中の１件のオブジェクトのオブジェクトＩＤ（Ｏ１）を取り出す。
【０１２０】
オブジェクトＩＤ（Ｏ１）が存在するか否か判定し（Ｓ６３３）、存在する場合は、オブジェクト情報マスターテーブルＴ５００からオブジェクトＩＤ（Ｏ１）に属する具象クラスＩＤ（Ｃ）を全件抽出する（Ｓ６３４）。そして、オブジェクトＩＤ（Ｏ１）と抽出した全件の具象クラスＩＤ（Ｃ）のリスト（Ｌ）を作成する（Ｓ６３５）。抽出した具象クラスＩＤ（Ｃ）の集合から１件の具象クラスＩＤ（Ｃ１）を取り出す（Ｓ６３６）。
【０１２１】
ステップＳ６３７において、具象クラスＩＤ（Ｃ１）が存在するか否かを判定し、存在する場合はクラス情報テーブルＴ１００を参照してクラスＩＤ（Ｃ１）の親クラス名を調べ、親クラス名がある場合は、スーパークラス情報テーブルＴ３００を参照してそのクラスＩＤを調べ、更にテーブルＴ１００を参照してそのクラスＩＤのクラス種類を調べることによって具象クラスＩＤ（Ｃ１）が参照するインターフェース及び具象クラスＩＤ（Ｃ１）の親に相当する抽象クラス（上位抽象クラス）のクラスＩＤ（Ｐ）を抽出する。
【０１２２】
更にステップＳ６３９では、オブジェクトＩＤ（Ｏ１）と、インターフェース及び上位抽象クラスＩＤ（Ｐ）をオブジェクト対インターフェース情報テーブルＴ６００に登録する。
【０１２３】
次に、登録されたインターフェース及び上位抽象クラス（Ｐ）から１件のインターフェース又は抽象クラスＩＤ（Ｐ１）を取り出す（Ｓ６４０）。クラスＩＤ（Ｐ１）が存在するか否かを判定し（Ｓ６４１）、存在する場合はクラスＩＤ（Ｃ１）をクラスＩＤ（Ｐ１）に置き換え（Ｓ６４２）、再びステップＳ６３８に戻って同じ処理が繰り返される。
【０１２４】
一方、ステップＳ６４１の判定でインターフェース及び抽象クラスＩＤ（Ｐ１）が存在しない場合は、リスト（Ｌ）よりオブジェクトＩＤ（Ｏ１）と具象クラスＩＤ（Ｃ１）のペアを削除し、ステップＳ６３６に戻って次の１件の具象クラスＩＤを取り出す。このステップＳ６３６〜Ｓ６４２の処理を繰り返すことによって、１件のオブジェクトＩＤ（Ｏ１）と、このオブジェクトＩＤ（Ｏ１）に属する全てのインターフェース及び抽象クラスのインターフェースＩＤ及び抽象クラスＩＤのペアの情報が登録されることになる。
【０１２５】
また、ステップＳ６３７の判定の結果、クラスＩＤ（Ｃ１）が存在しないと判定された場合はステップＳ６３２に戻り、次の１件のオブジェクトＩＤを取り出して、同様の処理が行われる。
【０１２６】
この結果、図６−２により生成された全件のオブジェクトＩＤ（Ｏ）と、このオブジェクトＩＤ（Ｏ）を付与されるインターフェースＩＤ及び抽象クラスＩＤの対照情報が作成される。
【０１２７】
（３．３）生成クラス情報テーブルの作成
図８−１は、生成クラス情報テーブルＴ７００に含まれる情報を示すもので、例えばクラスＡのオブジェクトをクラスＢで生成している場合、クラスＡを被生成クラス、クラスＢを生成クラスとしてクラスＡとクラスＢのＩＤを登録したものである。
【０１２８】
図８−２は、生成クラス情報テーブルを作成するフローを示す。ステップＳ７０１では、メソッド関連情報テーブルＴ４００から、参照先メソッド名及びメソッド戻り型名が未定義であるレコード（Ｒ１）を抽出する。このレコード（Ｒ１）は、そのクラスでオブジェクトを生成する処理、すなわちインスタンス化を行っている可能性があることを示す。ステップＳ７０２では、そのレコード（Ｒ１）のクラスＩＤ、メソッドＩＤ及び参照先クラス名、参照先パッケージ名を取り出す。取り出したレコード（Ｒ１）のクラスＩＤを被生成クラスのクラスＩＤと見なし、参照先クラス名の欄のクラスを、オブジェクトを生成している生成クラス名と見なす。
【０１２９】
次に、ステップＳ７０４において、クラス情報テーブルＴ１００を参照して、生成クラス名をキーにしてそのクラスＩＤを取得する。更にステップＳ７０５において、上記被生成クラスＩＤと生成クラスＩＤの組が、生成クラス情報テーブルＴ７００に登録済みか否かを判定し、既に登録されている場合はステップＳ７０２に戻り、登録されていなかった場合には、そのテーブルＴ７００に登録する（Ｓ７０６）。
【０１３０】
一方、ステップＳ７０３の判定がＮＯの場合は、ステップＳ７０７に進み、メソッド関連情報テーブルＴ４００から参照先メソッド名が参照先クラス名と等しく、且つメソッド戻り型名が未定義であるレコード（Ｒ２）を抽出する。この抽出されたレコード（Ｒ２）は、いわゆるｎｅｗ演算子が記述されたクラス、つまりＳ７０２とは異なる方法でオブジェクトを生成していることを示す。以下、ステップＳ７０８〜Ｓ７１２において、前述のステップＳ７０２〜Ｓ７０６とまったく同様にして、被生成クラスＩＤと生成クラスＩＤのペアの情報が生成され、登録される。
【０１３１】
この結果、オブジェクトを生成する資格のある具象クラスのＩＤ（被生成クラスＩＤ）と、そのオブジェクトを現に生成している具象クラスのＩＤ（生成クラスＩＤ）との対照表が作成される。
【０１３２】
（３．４）全抽象メソッド情報登録処理
図９は、全抽象メソッド情報登録処理のフローを示す。この処理は、継承関係のために隠蔽されている抽象メソッドを可視化する処理である。
【０１３３】
まずステップＳ８０１では、クラス情報テーブルＴ１００及びスーパークラス情報テーブルＴ３００より、上位インターフェース及び上位抽象クラスが、存在しないインターフェース及び抽象クラスのクラスＩＤの全件（Ｔ）を抽出する。抽出した全件のクラスＩＤ（Ｔ）から、１件ずつインターフェース又は抽象クラスのクラスＩＤ（Ｔ１）を取り出す（Ｓ８０２）。ステップＳ８０３でクラスＩＤ（Ｔ１）が存在するか否か判定し、ＹＥＳの場合にはステップＳ８０４に進む。ステップＳ８０４では、メソッド情報テーブルＴ２００を参照して、クラスＩＤ（Ｔ１）のレコードを取り出し、そのメソッドの中から抽象メソッドのメソッドＩＤ（ＴＭ）を抽出する。
【０１３４】
次にステップＳ８０５において、クラス情報テーブルＴ１００とスーパークラス情報テーブルＴ３００を参照して、上記のインターフェース又は抽象クラスのクラスＩＤ（Ｔ１）の子インターフェース及び子抽象クラスのクラスＩＤの集合（Ｓ）を抽出する。抽出したクラスＩＤの集合（Ｓ）から、１件ずつ子インターフェース又は子抽象クラスのクラスＩＤ（Ｓ１）を取り出し、メソッド情報テーブルＴ２００を参照して、クラスＩＤ（Ｓ１）に属するメソッドＩＤの最大値（ＭＭ）を求める（Ｓ８０８）。
【０１３５】
更にステップＳ８１０では、前述のステップＳ８０４で抽出した抽象メソッドＩＤ（ＴＭ）を全件、上記子インターフェース又は子抽象クラスのクラスＩＤ（Ｓ）のメソッドとしてメソッド情報テーブルＴ２００に登録する。この結果、親のインターフェース又は親の抽象クラスに属する抽象メソッドが、子のインターフェース又は子の抽象クラスに属する抽象メソッドとして登録される。その際、抽象メソッドＩＤには、親子の階層を示す情報として（ＭＭ）から始まる番号を設定する。更にステップＳ８１１では、子の抽象クラスのクラスＩＤの集合（Ｓ）をサブクラス一覧（ＳＬ）に追加する。
【０１３６】
このようにして、親の抽象クラスの集合（Ｔ）と子の抽象クラスの集合（Ｓ）について、全て繰り返し同様の処理を行った後、ステップＳ８１３において、（Ｔ）の内容を（ＳＬ）の内容で置き換える。これにより、親子の関係にある抽象クラス又はインターフェースの全ての抽象メソッドが可視化されて、抽象メソッドテーブルＴ２００に登録されたことになる。
【０１３７】
（３．５）インターフェース対実装対応情報テーブルの作成
図１０−１は、インターフェース対実装対応情報テーブルＴ８００に含まれる情報を示すもので、参照先インターフェースまたは参照先抽象クラスのクラスＩＤ、及び参照先インターフェースまたは参照先抽象クラスにおける参照先抽象メソッドのメソッドＩＤと、その抽象メソッドが属するオブジェクトＩＤの情報が含まれる。また、同じオブジェクトＩＤに属する具象メソッドのメソッドＩＤと、その具象メソッドが属する具象クラスのクラスＩＤも含まれる。
【０１３８】
図１０−２は、インターフェース対実装対応情報テーブルを作成するフローチャートを示す。まずステップＳ９０１において、クラス情報テーブルＴ１００からインターフェース及び抽象クラスの全件のクラスＩＤ（Ａ）を抽出する。次に、ステップＳ９０２において、抽出したクラスＩＤ（Ａ）よりインターフェース又は抽象クラスのクラスＩＤを１件（Ａ１）ずつ順次取り出す。更に、ステップＳ９０３において、クラスＩＤ（Ａ１）が存在するか否か判定し、ＹＥＳの場合はメソッド情報テーブルＴ２００を参照して、インターフェース又は抽象クラスのクラスＩＤ（Ａ１）に属する抽象メソッドのメソッドレコード（ＡＭ）を抽出する（Ｓ９０４）。
【０１３９】
次に、抽象メソッドレコード（ＡＭ）が１件以上存在するか否か判定し（Ｓ９０５）、存在する場合は、オブジェクト対インターフェース情報テーブルＴ６００を参照して、抽象クラス（Ａ１）が属するオブジェクトＩＤ（Ｏ）を抽出する（Ｓ９０６）。抽象クラスは、複数個のオブジェクトＩＤに属すことができるので、抽出したオブジェクトＩＤ（Ｏ）からオブジェクトＩＤを１件ずつ（Ｏ１）順次取り出す（Ｓ９０７）。次に、ステップＳ９０８において、オブジェクトＩＤ（Ｏ１）が存在するか否か判定し、ＹＥＳの場合はステップＳ９０９に進む。
【０１４０】
ステップＳ９０９においては、オブジェクト情報マスターテーブルＴ５００を参照して、オブジェクトＩＤ（Ｏ１）に属する具象メソッドを求め、更にメソッド情報テーブルＴ２００を参照して、その具象メソッドの名称、引数等を含むメソッドレコード（ＣＭ）を階層番号の大きな順に抽出する。ステップＳ９１０において、具象メソッドレコード（ＣＭ）が１件以上存在するか否か判定し、ＹＥＳの場合はステップＳ９１１に進む。ステップＳ９１１においては、抽象メソッドのメソッドレコード（ＡＭ）からメソッド名称、引数情報を１件ずつ（ＡＭ１）順次取り出す。更にステップＳ９１２において、抽象メソッドのメソッドレコード（ＡＭ）を全て読み出したか否か判定し、全てレコードを読み出した場合はステップＳ９１３に進み、具象メソッドのメソッドレコード（ＣＭ）から、レコード番号の大きい順にメソッド名称、引数情報を１件ずつ（ＣＭ１）取り出す。そしてステップＳ９１４でＡＭ１＝ＣＭ１か否かを判定し、ＡＭ１とＣＭ１が等しいときは、抽象クラスのクラスＩＤ（Ａ１）及び抽象クラスＩＤ（Ａ１）に属する抽象メソッドのメソッドＩＤ（ＡＭ１）よりなる抽象クラス・メソッドＩＤと、具象メソッドＩＤ（ＣＭ１）と該具象メソッドＩＤが属するクラスのクラスＩＤよりなる具象クラス・メソッドＩＤとが同じオブジェクトＩＤ（Ｏ１）に属すると見なされる。そしてステップＳ９１６において、抽象クラス・メソッドＩＤと、具象クラス・メソッドＩＤと、オブジェクトＩＤとの組がインターフェース対実装対応情報テーブルＴ８００に登録される。
【０１４１】
このようにして、ステップＳ９０１〜Ｓ９１７を繰り返し実行することによって、全てのインターフェース及び抽象クラスのクラス・メソッドＩＤが属するオブジェクトＩＤと、そのオブジェクトＩＤに属する具象クラスのクラス・メソッドＩＤとの関係を示すインターフェース対実装対応情報テーブルＴ８００を作成することができる。
【０１４２】
（４）メソッド間関連情報の生成
以上のようにして生成された各種の情報に基づいて、メソッド間関連情報を作成する。メソッド間関連情報とは、図１−５を例にとると、具象クラス・メソッドＩＤのＣ１１ｍ２と、その参照先の具象クラス・メソッドＩＤのＣ２１ｍ４とのペア情報を称し、Ｃ１１ｍ２を参照元のクラス・メソッドＩＤ、Ｃ２１ｍ４を参照先のクラス・メソッドＩＤという。なお、具象クラス・メソッドが抽象クラスやインターフェースを介して他の具象クラスを参照する場合もあるので、関連先クラス・メソッドＩＤ、関連元クラス・メソッドＩＤということもある。
【０１４３】
このメソッド間の関連を表すペア情報は、図１１−１に示すように、クラス情報テーブルＴ１００、メソッド情報テーブルＴ２００、メソッド関連情報テーブルＴ４００、生成クラス情報テーブルＴ７００、オブジェクト情報マスターテーブルＴ５００及びインターフェース対実装対応情報テーブルＴ８００の情報を参照しながら最終的に、メソッド間関連情報テーブルＴ９００を作成することにより生成される。
【０１４４】
図１１−２は、メソッド間関連情報テーブルＴ９００に含まれる情報を示す。９０１は処理フラグで、このテーブルＴ９００を作成する過程で用いられる。分析が済んだときは０、オブジェクトＩＤを特定できないときは１、オブジェクトＩＤと参照先のクラス・メソッドを特定できないときには２がセットされる。９０２は参照元（関連元）クラスが属するオブジェクトのＩＤであり、前記のペア情報を生成するために用いられる。９０３は参照元（関連元）の具象クラス（実装クラス）のクラスＩＤ、９０４は参照元（関連元）の具象メソッド（実装メソッド）のメソッドＩＤであり、９０３と９０４により参照元（関連元）の具象クラス・メソッドＩＤが形成される。９０３の情報はメソッド関連情報テーブルＴ４００（図３−４）のクラスＩＤと同じであり、９０４は該テーブルＴ４００のメソッドＩＤと同じである。９０５は参照先（関連先）クラス・メソッドが属するオブジェクトのＩＤであり、これも前述のペア情報を生成するために用いられる。抽象メソッド又はインターフェースが介在するために参照先の具象クラス・メソッド及び、そのクラス・メソッドが属するオブジェクトＩＤが特定できないとき、つまり処理フラグ９０１が１又は２の場合、このオブジェクトＩＤ９０５としてオール０が設定される。９０６は参照先（関連先）の具象クラス（実装クラス）のクラスＩＤ、９０７は参照先（関連先）具象メソッドのメソッドＩＤである。
【０１４５】
次に、図１１−３から図１１−６を参照して、メソッド間関連情報を作成するフローについて説明する。
【０１４６】
ステップＳ１００１において、メソッド情報テーブルＴ２００（図３−２）から具象メソッドを１件ずつ取り出す。ステップＳ１００２で具象メソッドが存在するか否かを判定し、存在する場合は、メソッド関連情報テーブルＴ４００（図３−４）を参照して、参照先クラス名、参照先メソッド名及び参照先パッケージ名の情報を取り出す（Ｓ１００３）。
【０１４７】
なお、以下の説明では、参照先及び関連先を代表して関連先とし、参照元及び関連元を代表して関連元という用語を用いる。
【０１４８】
ステップＳ１００４で関連先情報が存在するか否か判定し、ＹＥＳの場合はステップＳ１００５に進む。
【０１４９】
ステップＳ１００５において、クラス情報テーブルＴ１００を参照し、抽出したクラス名及びパッケージ名をキー情報として、関連先クラスのクラスＩＤ及びクラス種類の情報を取り出す。更にステップＳ１００６において、メソッド情報テーブルＴ２００を参照し、先に取り出したメソッド名と、上記ステップＳ１００５で取り出したクラスＩＤをキー情報として、メソッドＩＤとメソッド種類の情報を取り出す。
【０１５０】
以上の処理により、ある具象クラスに属する具象メソッドの関連先クラスのクラスＩＤ及びクラス種類と、関連先メソッドのメソッドＩＤ及びメソッド種類の情報が得られたことになる。ここでクラス種類は、クラス情報テーブルＴ１００のテーブル項目値により、図１１−５に示すように、インターフェース、抽象クラス、具象クラスに分類され、メソッド種類は、メソッド情報テーブルＴ２００のテーブル項目値より抽象メソッド、具象メソッド、ｓｔａｔｉｃメソッドに分類される。なお、メソッド種類のレコードのないメソッドもある。
【０１５１】
図１１−３のステップＳ１００８では、これらのクラス及びメソッドの分類に応じて、図１１−５に示すような処理区分（１）〜（８）が決定される。例えば処理区分（１）は、関連先クラスがインターフェースであり、関連先メソッドが抽象メソッドである場合の処理を示し、処理区分（２）は、関連先クラスが抽象クラスであり、関連先メソッドが抽象メソッドである場合の処理を示している。なお、図１１−５の表で斜線を施した箇所は、クラス・メソッドの組み合わせとして理論的に存在し得ないことを示している。
【０１５２】
図１１−４を参照して、まず処理区分（１）と（２）について説明する。
【０１５３】
関連先クラスの種類がインターフェースか抽象クラスで、関連先メソッドの種類が抽象メソッドの場合、まずステップＳ１０２０において、インターフェース対実装対応情報テーブルＴ８００を参照して、そのクラス・メソッドが属するオブジェクトＩＤと、そのオブジェクトＩＤに属する具象クラスＩＤ及び具象メソッドＩＤを取り出す。取り出したオブジェクトＩＤが１件だけか否か判定し（Ｓ１０２１）、１件しかない場合は、上記の取り出したオブジェクトＩＤを関連先のオブジェクトＩＤと決定する（Ｓ１０２２）。また、当該オブジェクトＩＤに属する具象クラスＩＤ及び具象メソッドＩＤも、それぞれ関連先具象クラスＩＤ及び関連先具象メソッドＩＤとして決定する（Ｓ１０２３）。
【０１５４】
ステップＳ１０２４では、メソッド間関連情報テーブルＴ９００の処理フラグ９０１に、分析済みを示す０をセットする。また、関連元具象メソッドが属する関連元クラスのクラスＩＤを関連元オブジェクトＩＤとする（Ｓ１０２５）。ステップＳ１０７５において、メソッド関連情報テーブルＴ９００の関連元クラスのオブジェクトＩＤ、関連元の具象クラス・メソッド、関連先のオブジェクトＩＤ、関連先の具象クラス・メソッドＩＤを登録する。
【０１５５】
一方、ステップＳ１０２２における判定がＮＯの場合は、関連先オブジェクトを全て０にする（Ｓ１０２６）と共に、関連先クラス及び関連先メソッドにも全部０をセットする（Ｓ１０２７）。更にステップＳ１０２８では、メソッド間関連情報テーブルＴ９００の処理フラグ９０１に、関連先のクラス・メソッド及びオブジェクトが未特定であることを示す２をセットする。また、関連元オブジェクトＩＤも全部０にセットする（Ｓ１０２９）。
【０１５６】
以上のように、関連先クラスの種類が、インターフェースが抽象クラスで、関連先メソッドの種類が抽象メソッドの場合は、予め作成したインターフェース及び抽象クラスのクラスＩＤと、該クラスＩＤが属するオブジェクトＩＤとの関係を表すテーブルＴ８００を参照してオブジェクトＩＤを探索し、次に当該オブジェクトＩＤに属する具象クラスのクラスＩＤ及び具象メソッドのメソッドＩＤを探索することにより、関連先の具象クラス・メソッドＩＤを特定する。
【０１５７】
次に、処理区分（５）又は（６）の場合、つまり、関連先のクラスが抽象クラスか具象クラスであって、関連先メソッドが具象メソッドである場合について説明する。クラスの種類が抽象クラスであっても、メソッドの種類が具象メソッドであれば、その抽象クラスにオブジェクトＩＤが付与されている。ステップＳ１０３０において、オブジェクト情報マスターテーブルＴ５００を参照し、具象メソッドＩＤ及びクラスＩＤをキーに、オブジェクトＩＤの情報を取り出す。この取り出したオブジェクトＩＤが関連先オブジェクトＩＤ候補となる。
【０１５８】
次に、上記オブジェクトＩＤ候補をキーとしてオブジェクト情報マスターテーブルＴ５００を検索し、関連先具象メソッドと、メソッド名及びメソッド引数が同じメソッドを取り出す。その際、クラスに親子関係がある場合は下位クラスから探索する（Ｓ１０３１）。
【０１５９】
Ｊａｖａにはキャストと呼ばれる仕組みがあり、同じ名前のメソッドがクラスの親子間で双方に定義されている（「オーバーライド」と言う）場合、関連先クラスが親クラスであっても、文法上は子クラスのメソッドを指す必要がある。従って、オブジェクトに関連付くクラスのうち、末端の子クラスから順にメソッドを検索し、最初に見つかったメソッドを関連先メソッドとする。この検索の条件が「メソッドの名称、引数が同じ」ということになる。
【０１６０】
例えば具象クラスＡ、Ｂが親と子の関係にあり、双方にメソッドｍ（  ）が定義されている場合。関連元クラスからの関連先が「クラスＡのメソッドｍ（  ）」であっても、オブジェクトがＢであれば参照先メソッドはクラスＢのメソッドｍ（  ）になる。オブジェクトマスター情報テーブルに対しクラスＡのメソッドｍ（  ）をキーに検索すると、オブジェクトＩＤはＡとＢが取得できる。オブジェクトがＢの場合にはステップＳ１０３１の手順でクラスＢのメソッドｍ（  ）を取り出す。ここでもしクラスＡが抽象クラスだった場合は、オブジェクトＩＤはＢのみ取得できる。この場合もステップＳ１０３１の手順でクラスＢのメソッドｍ（  ）を取り出す。
【０１６１】
ステップＳ１０３２では、取り出した関連先オブジェクトＩＤの候補が１件か否かを判定し、１件の場合は、取り出したオブジェクトＩＤ候補を関連先オブジェクトＩＤとする（Ｓ１０３３）。また、ステップＳ１０３１の探索により得られた具象メソッド及びその具象メソッドが属する具象クラスを、関連先具象クラス、関連先具象メソッドとする（Ｓ１０３４）。
【０１６２】
ステップＳ１０３５では、メソッド間関連情報テーブルＴ９００の処理フラグ９０１に分析済みを示す０をセットする。また、関連元クラスのオブジェクトＩＤ候補を関連元オブジェクトＩＤとして、同様にステップＳ１０７５で関連元、関連先のオブジェクトＩＤ、具象クラス・メソッドＩＤを登録する。
【０１６３】
一方、ステップＳ１０３２の判定の結果、ＮＯの場合はＳ１０２６〜Ｓ１０２９と同様に、関連元、関連先オブジェクトＩＤ及び関連元、関連先クラス・メソッドＩＤに全部０がセットされる（Ｓ１０３７〜Ｓ１０４０）。
【０１６４】
以上のように、関連先のクラス種類が抽象クラスや具象クラスで、関連先のメソッドの種類が具象メソッドの場合も、オブジェクトＩＤを手がかりにして関連先の具象クラス（実装クラス）及び具象メソッド（実装メソッド）を特定できる場合がある。
【０１６５】
次に、処理区分が（３）の場合、つまりクラスが抽象クラスでメソッド情報がない場合は、ステップＳ１０５０〜Ｓ１０５６により関連元、関連先のオブジェクトＩＤ、関連元、関連先の具象クラス・メソッドＩＤを特定する。メソッド情報テーブルに関連先メソッドの定義が無いとは、参照先メソッドが関連先メソッドで定義されずに、上位クラスで定義されていることを指す。関連先クラス・メソッドがメソッド情報テーブルに定義されていないのでオブジェクト情報マスターテーブルにも当該クラス・メソッドは定義されていない。そこで、上位クラスに具象メソッドを探し求める。ステップＳ１０５０では、メソッド名称と引数が同じであるという探索条件で上位クラスの具象メソッド（実装メソッド）を求める。次にステップＳ１０５１では、特定した具象メソッド（実装メソッド）と、そのメソッドが属するクラス情報をキーとしてオブジェクトをオブジェクト情報マスターテーブルを検索し、オブジェクト候補を取り出す。
【０１６６】
以下のステップＳ１０５２〜Ｓ１０６０は、前述のステップＳ１０３２〜Ｓ１０４０と同じである。
【０１６７】
処理区分（４）は、関連先のクラス種類が具象クラスでメソッド情報がない場合である。この場合は、オブジェクトＩＤは関連先クラスのＩＤであるから、オブジェクトを探索する手順が不要となり、上位クラスの具象メソッド（実装メソッド）を探索する手順のみとなる。すなわちステップＳ１０７０において、スーパークラス情報テーブルＴ３００を参照して上位クラス（親クラス）のクラス名を探索し、次にメソッド情報テーブルＴ２００を参照して、その上位クラスのクラスＩＤから、そのクラスＩＤに属するメソッドを探索する。そして、そのメソッドの中でメソッド種類が０のメソッド、すなわち具象メソッドを取り出す（Ｓ１０７０）。この具象クラス及び具象メソッドをキーに、オブジェクト情報マスターテーブルＴ５００から関連先のオブジェクトＩＤを取り出す。取り出したオブジェクトＩＤ、具象クラスＩＤ及び具象メソッドＩＤを、それぞれ関連先のオブジェクトＩＤ、関連先の具象クラスＩＤ、関連先の具象メソッドＩＤとする（Ｓ１０７２）。更に、メソッド間関連情報テーブルＴ９００の処理フラグ９０１に分析済みを示す０をセットする（Ｓ１０７３）。また、関連元クラスのオブジェクトＩＤ候補を関連元オブジェクトＩＤとして（Ｓ１０７４）、メソッド間関連情報テーブルＴ９００に登録する。
【０１６８】
一方、処理区分が（７）及び（８）の場合、つまりクラスの種類が抽象クラスか具象クラスで、メソッドの種類がｓｔａｔｉｃの場合は、ステップＳ１０７１において、メソッドを関連先具象メソッドとし、クラスを関連先の具象クラスとする。
【０１６９】
以上の説明から明らかなように、オブジェクトＩＤという新しい概念を導入することにより、オブジェクトＩＤを手がかりにして関連先の具象クラス・メソッドを特定する精度を高めることが可能となる。
【０１７０】
（５）特定できない関連先クラス・メソッドのオブジェクトＩＤの探索
図１１−３及び図１１−４の処理により、関連先クラス・メソッドが属するオブジェクトＩＤを特定できなかった場合には、メソッド間関連情報テーブルＴ９００（図１１−２）の処理フラグ９０１が“１”となる。
【０１７１】
また関連先クラス・メソッドＩＤと、関連先クラス・メソッドが属するオブジェクトＩＤの両方が特定できなかった場合は、メソッド間関連情報テーブルＴ９００の処理フラグ９０１に“２”がセットされる。
【０１７２】
このように関連先クラス・メソッドが属するオブジェクトＩＤが特定できなかった場合は、文脈ＩＤを用いてこれらを探索する処理が行われる。
【０１７３】
ここで文脈ＩＤとは、階層化された構造を有するＪａｖａ言語プログラムにおいて、最も上位に位置するクラスのＩＤを指す。例えば図１−５では、クラスＣ１１が文脈クラスに相当する。証券業務などの大規模業務系のように、数万〜数１０万個のクラスを有するプログラムでは、最上位の階層に属する文脈クラスは数千個程度であり、この文脈クラス配下に多数のクラスがツリー状に階層化されて配列されている。
【０１７４】
図１２−１は、文脈ＩＤを用いて未特定オブジェクトＩＤ及び未特定クラス・メソッドＩＤの探索処理を行うフローチャートを示す。まずステップＳ１５０１においては、未解決オブジェクト対文脈ＩＤ情報テーブルＴ１０００の作成処理を行う。このテーブルＴ１０００は図１２−１に示すように、未特定のオブジェクトＩＤ又は未特定の関連先クラス・メソッドＩＤを含むメソッド間関連情報テーブルＴ９００のレコード番号情報１００１と、関連元クラス・メソッド９０３，９０４が属する文脈クラスのＩＤ１００２，文脈メソッドのＩＤ１００３を含む。また処理の済又は未済の区分を示すフラグ情報１００４を含む。
【０１７５】
次にステップＳ１５０２において、文脈毎生成クラス情報テーブルＴ１１００の作成処理を行う。このテーブルＴ１１００は、図１２−３に示すように関連元クラス・メソッド９０３，９０４が属する文脈クラスのＩＤ１１０１文脈メソッドのＩＤ１１０２と、この文脈クラス・メソッドＩＤの配下にある全ての関連先クラスの被生成クラスＩＤ１１０３の情報を含む。
【０１７６】
次にステップＳ１５０３において未特定オブジェクトＩＤの探索処理を行う。ステップＳ１５０４において探索件数が残っているか否かを判定し、残りが０になるまで同じ処理を繰り返す。
【０１７７】
次にステップＳ１５０１，Ｓ１５０２，Ｓ１５０３の処理の具体的な内容を図１３−１，１３−２，１３−３を参照して説明する。
【０１７８】
図１３−１は、ステップＳ１５０１の未解決オブジェクト対文脈ＩＤ情報テーブルＴ１０００の作成処理を示すフローチャートである。
【０１７９】
ステップＳ１６０１では、図１１−２に示したメソッド間関連情報テーブルＴ９００の処理フラグ９０１が１又は２のレコードを全件抽出する。すなわち、これらのレコードは、参照先が隠蔽クラスでオブジェクトＩＤが不明なものを表す。抽出したレコードは１件ずつ処理し（Ｓ１６０２）、全件終了するまで行われる（Ｓ１６０３）。
【０１８０】
ステップＳ１６０４では、抽出したレコードの参照元クラスＩＤ９０３及び参照元メソッドＩＤ９０４を参照先としているクラス・メソッドを検索し、更に検索したクラス・メソッドを参照先としているクラス・メソッドを検索する処理を繰り返すことにより、ツリー状の階層構造をしたプログラムの最上位階層に位置する文脈クラス・メソッドを探索する。抽出したレコードの参照元クラスＩＤ９０３及び参照元メソッドＩＤ９０４を参照先とするクラス・メソッドは複数個となることもあるから探索の結果得られる文脈クラス・メソッドも複数個となることがある。
【０１８１】
次に見付かった全ての文脈ＩＤに対して次の処理を行う（Ｓ１６０５）。すなわちステップＳ１６０２で抽出したレコードのレコード番号と、ステップＳ１６０４で見付かった文脈クラス・メソッドＩＤの組を前記テーブルＴ１０００に１レコードとして登録し、処理済フラグ１００４の欄には、ＯＦＦを設定する。但し既に当該レコード番号と、当該文脈ＩＤを組としたレコードが登録済であるときには二重に登録することはしない。
【０１８２】
上記の処理フローにより、関連先クラス・メソッドが属するオブジェクトＩＤを特定できないものが、どの文脈クラス・メソッドの配下にあるかを特定することができる。
【０１８３】
図１３−２は、文脈毎被生成クラス情報テーブルＴ１１００の作成処理（Ｓ１５０２）を示すフローチャートである。
【０１８４】
ステップＳ１７０１では、未解決オブジェクト対文脈ＩＤ情報テーブルＴ１０００（図１２−２）に登録されている文脈クラスＩＤ１００２及び文脈メソッドＩＤ１００３を処理フラグ１００４がＯＦＦのレコードのみを対象として全件取り出す。抽出した文脈クラス・メソッドＩＤを１件ずつ処理し（Ｓ１７０２）、全件終了するまで行われる（Ｓ１７０３）。
【０１８５】
ステップＳ１７０４においては、取り出した文脈クラス・メソッドＩＤの参照先クラス・メソッドＩＤを検索し、更に検索したクラス・メソッドＩＤの参照先クラス・メソッドＩＤを検索する処理を繰り返すことにより、参照先がないツリー構造の末端まで繰り返し検索する。
【０１８６】
ステップＳ１７０５では、検索の結果見付かった全ての階層の全ての参照先具象クラスＩＤをキー情報として生成クラス情報テーブルＴ７００を検索し、被生成クラスのＩＤを抽出する。すなわち登録されている文脈クラスの配下にある具象クラスでオブジェクトを生成されている被生成クラスＩＤを全てリストアップする。
【０１８７】
ステップＳ１７０６では、ステップＳ１７０１で取り出された文脈クラス・メソッドＩＤと、ステップＳ１７０５で抽出された被生成クラスＩＤの組を１レコードとして文脈毎被生成クラス情報テーブルＴ１１００に登録する。すなわち、当該文脈クラスの配下の具象クラスで生成されている全ての被生成クラスのＩＤは、当該文脈クラスの配下で利用されている全オブジェクトＩＤであるという考え方により、次に説明する探索処理でこのテーブルＴ１１００が利用されることになる。
【０１８８】
図１３−３は未解決のオブジェクトＩＤを特定する処理を行うフローチャートを示す。ステップＳ１８０１において前述の未解決オブジェクト対文脈ＩＤ情報テーブルＴ１０００から処理済フラグ１００４がＯＦＦのレコードを全件取り出し、これを１件ずつ処理する（Ｓ１８０２）。
【０１８９】
ステップＳ１８０３において、全件のレコードの処理が終了したか否か判定し、ＮＯの場合はステップＳ１８０４に進む。ステップＳ１８０４においては、メソッド間関連情報テーブルＴ９００（図１１−２）から、上記レコードのレコード番号で示すテーブルＴ９００のレコードを取得する。
【０１９０】
ステップＳ１８０６では、取り出したレコードの処理フラグ９０１が“１”（オブジェクトＩＤ未特定）か、“２”（クラス・メソッドＩＤ及びオブジェクトＩＤが未特定）かを判定し、“１”の場合はステップＳ１８０７に進む。
【０１９１】
ステップＳ１８０７では、テーブルＴ９００の参照先クラスのクラスＩＤ９０６及び参照先メソッドのメソッドＩＤ９０７をキー情報としてオブジェクト情報マスターテーブルＴ５００（図６−１）を参照し、そのクラスＩＤ及びメソッドＩＤと一致するオブジェクトＩＤを検索する。
【０１９２】
一方、ステップＳ１８０６の判定が“２”の場合は、ステップＳ１８０８に進み、テーブルＴ９００の参照先クラスのクラスＩＤ９０６及び参照先メソッドのメソッドＩＤ９０７をキー情報として、インターフェース対実装対応情報テーブルＴ８００（図１０−１）を参照し、参照先クラスＩＤと参照先メソッドＩＤが一致するレコードを検索する。そして一致したレコードのオブジェクトＩＤ及びそのオブジェクトＩＤに属する具象クラスのクラスＩＤ及び具象メソッドのメソッドＩＤを取得する。
【０１９３】
ステップＳ１８０９においては、文脈毎被生成クラス情報テーブルＴ１１００を参照して、ステップＳ１８０７及びＳ１８０８で取得したオブジェクトＩＤと、被生成クラスＩＤ１１０３が一致し、且つステップＳ１８０２で抽出したレコードの文脈クラスＩＤ及び文脈メソッドＩＤとテーブルＴ１１００の文脈クラスＩＤ１１０１及び文脈メソッドＩＤ１１０２が一致するレコードを検索する。
【０１９４】
このように参照元クラスが属する文脈を検索する理由は、隠蔽クラスが属する文脈と、参照元クラスが属する文脈は同一であるためである。すなわち、関連元クラス・メソッドＩＤと、関連先のクラス・メソッドＩＤは同一の文脈に属しているという考え方に基づく。
【０１９５】
ステップＳ１８１０では取得したオブジェクトＩＤと一致する被生成クラスＩＤが見付かったか否かを判定し、見付かった場合は、ステップＳ１８０４で取得したメソッド間関連情報テーブルＴ９００の参照元クラス・メソッドＩＤ９０３，９０４及び参照元クラス・メソッドが属するオブジェクトＩＤと、ステップＳ１８０７，Ｓ１８０８で取得した参照先クラス・メソッドＩＤ及びその参照先クラス・メソッドが属するオブジェクトＩＤと、参照元及び参照先の文脈クラス・メソッドＩＤを新たなレコードとしてメソッド間関連情報テーブルＴ９００に登録する。
【０１９６】
すなわち、隠蔽クラス（参照先の抽象クラス）が属するオブジェクトＩＤ候補の中に、その隠蔽クラスの参照元クラスが属する文脈の配下で生成されるクラス（被生成クラス）が含まれているかどうかを検索し、含まれている場合には、そのオブジェクトＩＤを隠蔽クラスのオブジェクトＩＤとする。
【０１９７】
この後、ステップＳ１８１２において、未解決オブジェクト対文脈ＩＤ情報テーブルＴ１０００の処理済フラグ１００４をＯＮにする。すなわち一度見付かったクラスにはフラグを立ててステップＳ１５０１から始まる次回処理では対象外とすることで重複した検索を防ぎ効率化を図っている。
【０１９８】
一方、ステップＳ１８０３の判定でＹＥＳの場合は、オブジェクトＩＤと一致した被生成クラスＩＤをマッチング件数としてカウントし（Ｓ１８０５）、図１２−１のステップＳ１５０４ではこのマッチヌ件数が０になるまで繰り返してＳ１５０１〜Ｓ１５０３の処理を行う。
【０１９９】
以上説明したように本発明によれば、文脈クラス・メソッドＩＤという新しい概念を用いることにより、特願２００６−３０６５２５では特定できなかったクラス・メソッドが属するオブジェクトＩＤも特定することが可能になる。
【０２００】
（６）具象クラス・メソッド間関連情報の表示
次に、上述のようにして生成された具象クラス・メソッド間関連情報を表示するためのフローを、図１４−１を参照して説明する。
【０２０１】
Ｊａｖａ言語プログラムのあるクラス・メソッドを指定し、例えばそのクラス・メソッドを修正した場合に、どの範囲のクラスに影響を及ぼすか解析を行うときには、まずステップＳ１３０１において、当該クラス・メソッドＩＤを指定する。次に、メソッド間関連情報テーブルＴ９００から当該クラス・メソッドの関連先クラス・メソッド、該関連先クラス・メソッドの更に関連先のクラス・メソッドというように、次々に関連先クラス・メソッド情報を抽出する。
【０２０２】
抽出されたクラス・メソッドの関連が、例えば図１４−２のように表される場合を例にとると、ステップＳ１３０３では図１４−３に示すようなクラス名、メソッド名及び引数の文字列からなるテキストデータを生成する。
【０２０３】
更にステップＳ１３０４では、生成したテキストデータをウェブ上で表示する既存のソフトウェアに受け渡し、ユーザのＰＣのウェブブラウザソフトウェア上に、例えば図１４−４のような形式で表示する（Ｓ１３０５）。
【０２０４】
このように、テキストデータを図１４−４のようにウェブ上で表示するソフトウェア自体は既に公知である。
【０２０５】
ここで、メソッド間関連情報テーブルＴ９００の情報には、表示を必要としない冗長な情報が含まれている場合もある。すなわち、テーブルＴ９００を作成する過程において、ある具象クラス・メソッドの関連先として登録された具象クラス・メソッドの中には、その候補として抽出されたものも含まれているため、ペア情報を表示する際には、登録された情報の中から必要な関連元・関連先具象クラス・メソッド情報を選択、抽出する処理が必要になる場合もある。
【０２０６】
図１４−５は、文脈クラス・メソッドＩＤの情報を用いて、テーブルＴ９００に登録された情報から表示する情報を絞り込む処理の一例を示すフローチャートである。
【０２０７】
まずステップＳ１９０１において、指定したクラス・メソッドＩＤとテーブルＴ９００における関連元具象クラス・メソッドＩＤが一致するレコードを抽出する。さらに抽出したレコードの関連先クラス・メソッドＩＤと関連元具象クラス・メソッドＩＤが一致するレコードを抽出し以下、同様に関連元と関連先が一致する一連のレコードを抽出する。
【０２０８】
ステップＳ１９０２では、その抽出された一連のレコードの関連先文脈クラス・メソッドＩＤが設定されているか否か判定し、ＹＥＳの場合は、更にステップＳ１９０３において、関連元文脈クラス・メソッドＩＤが設定されているか否か判断する。ステップＳ１９０３の判定もＹＥＳの場合は、ステップＳ１９０５において、関連元文脈クラス・メソッドＩＤと関連元文脈クラス・メソッドＩＤが一致するレコードを抽出し、そのレコードにおける関連元、関連先の具象クラス・メソッドＩＤのペア情報を表示する。すなわち、同じ文脈配下にある具象クラス・メソッドのペア情報は冗長な情報ではないので、必ず表示することになる。
【０２０９】
一方、ステップＳ１９０３においてＮＯと判定された場合、つまり関連元具象クラス・メソッドの文脈クラス・メソッドＩＤが設定されていない場合は、指定した文脈クラス・メソッドＩＤと、関連先文脈クラス・メソッドＩＤが一致するレコードを抽出し、そのレコードの具象クラス・メソッドＩＤのペア情報を表示する。すなわち、表示の際にユーザが文脈を指定した場合は、その文脈以外の情報を表示する必要がないためである。
【０２１０】
ステップＳ１９０２の判定がＮＯの場合は、ステップＳ１９０４に進み、関連元文脈クラス・メソッドＩＤが設定されているか否かを判定する。この判定がＹＥＳの場合は、抽出したレコード全部の関連元、関連先具象クラス・メソッドＩＤのペア情報を表示する。但しステップＳ１９０５の一致レコードがある場合は、ステップＳ１９０７の情報は表示しない。すなわち関連先文脈クラス・メソッドＩＤが無く、関連元文脈クラス・メソッドＩＤだけが設定されている場合は、冗長な情報を含んでいるか否かの判断ができないので、原則として全レコードを表示する。
【０２１１】
またステップＳ１９０８の場合、つまり関連先文脈クラス・メソッドＩＤ及び関連元文脈クラス・メソッドＩＤの両方ともに設定されていない場合も、全レコードを抽出し、全レコードの具象クラス・メソッドＩＤのペア情報を表示する
図１４−６は、文脈クラス・メソッドＩＤを用いて、テーブルＴ９００に登録された情報から表示する情報を絞り込む処理の別の例を示すフローチャートである。
【０２１２】
ステップＳ２００１では、指定したクラス・メソッドＩＤと関連先クラス・メソッドＩＤが一致するレコードを抽出する。さらに抽出したレコードの関連先クラス・メソッドを関連元クラス・メッソッドＩＤとするレコードを検索し、以下同様に、関連先と関連元クラス・メソッドが一致する一連のレコードを検索する。
【０２１３】
その後、ステップＳ２００２及びＳ２００３，Ｓ２００４において、関連元及び関連先の項目に文脈クラス・メソッドＩＤが設定されているか否か判定する。関連元文脈クラス・メソッドＩＤと関連先文脈クラス・メソッドＩＤが設定されている場合は、両ＩＤが一致するレコードを抽出し、そのレコードの具象クラス・メソッドＩＤのペア情報を表示する（Ｓ２００５）。
【０２１４】
一方、関連元文脈クラス・メソッドＩＤは設定されているが、関連先文脈クラス・メソッドＩＤは設定されていない場合は、原則として全レコードの具象クラス・メソッドＩＤのペア情報を表示するが、ステップＳ２００５の一致レコードがある場合は、レコードを抽出しない（Ｓ２００６）。
【０２１５】
また関連元文脈クラス・メソッドＩＤが設定されず、関連先文脈クラス・メソッドＩＤが設定されている場合（Ｓ２００７）も、ステップＳ２０６と同様の処理を行う。
【０２１６】
更に関連元文脈クラス・メソッドＩＤ及び関連先文脈クラス・メソッドＩＤの両方ともに設定されていない場合は、全レコードを抽出して、すべての関連元、関連先の具象クラス・メソッドＩＤのペア情報を表示する。
【０２１７】
以上述べたように、文脈クラス・メソッドＩＤを用いることによって、メソッド間関連情報テーブルに登録された情報から適正な情報だけを選択抽出して表示することが可能になる。
【０２１８】
図１４−７は、本発明ツールが適用される大規模業務系の説明図であり、７０は端末機器、７１はサーバ、７２はＤＢ、７３は保守用のパソコンである。
【０２１９】
証券業務を例にとると、各支店に設置された数百台〜数千台のパソコンからなる端末７０がネットワーク７４を通して本店のサーバ７１に接続されている。各端末７０からは証券や債券の取引等のデータが入力され、本店のサーバ７１により処理されてデータベース７２に蓄積される。
【０２２０】
一方、この証券業務システムに用いられるＪａｖａ言語プログラムの保守を行うために、前述のテーブルＴ１００〜Ｔ９００で示されたデータがＤＢ７２に格納され、各フローチャートで示されたプログラムが保守用のパソコン７３に格納されている。保守用のパソコン７３から特定のクラス・メソッドを指定する情報を入力すると、図１４−４に例示した関係図が画面に表示される。
【０２２１】
以上説明した本発明ツールによれば、Ｊａｖａ言語プログラムにおけるクラス継承により、ソースコードプログラム上では隠蔽されたクラス・メソッドも含めて、具象クラス・メソッド間の関連を表示することが可能となる。また、クラス・メソッドの数が数１０万個から数１００万個に達する大規模業務系のＪａｖａ言語プログラムの中で、特定の業務処理（トランザクション）に用いられる全ての具象クラス・メソッドを抽出し、これを画面上に表示することができる。
【０２２２】
更に、所定の具象クラス・メソッドを指定して、それに関連する具象クラス・メソッドを抽出・表示することにより、所定の具象クラス・メソッドが影響を及ぼす範囲を特定することもできる。
【０２２３】
従って、あるデータ項目にアクセスするクラス・メソッドを指定して、そのデータ項目が利用されているトランザクション、データベース並びに業務ロジックなどを特定することが可能となるため、大規模業務系のＪａｖａ言語プログラムの保守作業の負担を従来に比べて著しく軽減することが可能となる。
【図面の簡単な説明】
【０２２４】
【図１−１】Ｊａｖａ言語プログラムの説明図。
【図１−２】Ｊａｖａ言語プログラムのクラス図の一例を示す説明図。
【図１−３】Ｊａｖａ言語プログラムのシーケンス図の一例を示す説明図。
【図１−４】Ｊａｖａ言語プログラムにおけるクラスに含まれる情報とその関連を示す説明図。
【図１−５】Ｊａｖａ言語プログラムをクラス・メソッドを単位として捉えた場合の処理の流れを示す説明図。
【図１−６】Ｊａｖａ言語プログラムにおけるクラス継承の概念を説明するための説明図。
【図２−１】Ｊａｖａソースコードプログラムの一例を示す説明図。
【図２−２】Ｊａｖａソースコードプログラムのコンパイルを説明するための図。
【図３−１】クラスファイルのクラス情報の内容を示す説明図。
【図３−２】クラスファイルのメソッド情報の内容を示す説明図。
【図３−３】クラスファイルのスーパークラス情報の内容を示す説明図。
【図３−４】クラスファイルメソッド関連情報の内容を示す説明図。
【図３−５】クラスファイルから各情報を抽出するフローを示すフローチャート。
【図３−６】クラスファイルを分析した結果得られるＸＭＬファイルを示す説明図。
【図４−１】クラス情報テーブルの説明図。
【図４−２】メソッド情報テーブルの説明図。
【図４−３】スーパークラス情報テーブルの説明図。
【図４−４】メソッド関連情報テーブルの説明図。
【図４−５】クラスファイルより抽出した情報をＤＢに投入するフローを示すフローチャート。
【図５】オブジェクトＩＤの情報を生成する仕組みを説明する説明図。
【図６−１】オブジェクトマスター情報テーブルの説明図。
【図６−２】オブジェクトマスター情報テーブルを作成するフローを示すフローチャート。
【図７−１】オブジェクト対インターフェース情報テーブルの説明図。
【図７−２】オブジェクト対インターフェース情報テーブルを作成するフローを示すフローチャート。
【図８−１】生成クラス情報テーブルの説明図。
【図８−２】生成クラス情報テーブルを作成するフローを示すフローチャート。
【図９】全抽象メソッド情報登録処理のフローを示すフローチャート。
【図１０−１】インターフェース対実装情報テーブルの説明図。
【図１０−２】インターフェース対実装情報テーブルを作成するフローを示すフローチャート。
【図１１−１】メソッド間関連情報テーブルと他のテーブルとの関係を示す説明図。
【図１１−２】メソッド間関連情報テーブルの説明図。
【図１１−３】メソッド間関連情報テーブルを作成するフローを示すフローチャート。
【図１１−４】メソッド間関連情報テーブルを作成するフローを示すフローチャート。
【図１１−５】クラス種類とメソッド種類の説明図。
【図１２−１】未特定オブジェクトＩＤ及び未特定クラス・メソッドＩＤの探索処理を行うフローチャート。
【図１２−２】未解決オブジェクト対文脈ＩＤ情報テーブルの説明図。
【図１２−３】文脈毎被生成クラス情報テーブルの説明図。
【図１３−１】未解決オブジェクト対文脈ＩＤ情報テーブル作成処理のフローチャート。
【図１３−２】文脈毎被生成クラス情報テーブル作成処理のフローチャート。
【図１３−３】未解決オブジェクトマッチング処理のフローチャート。
【図１４−１】クラス・メソッド間の関係を表示するフローを示すフローチャート。
【図１４−２】クラス・メソッド間の関係を表示する説明図。
【図１４−３】クラス・メソッド間の関係を表示するために生成するテキストデータの説明図。
【図１４−４】クラス・メソッド間の関係を表示する画面の説明図。
【図１４−５】メソッド間関連情報テーブルに登録された情報から表示情報を選択抽出する処理の一例を示すフローチャート。
【図１４−６】メソッド間関連情報テーブルに登録された情報から表示情報を選択抽出する処理の他の例を示すフローチャート。
【図１４−７】本発明ツールから適用されるシステムの一例を示すブロック図。
【符号の説明】
【０２２５】
１００，３００，４００：具象クラス
２００：インターフェース
１００´，３００´，４００´：オブジェクト
１０：クラス情報
２０：メソッド情報
３０：メソッド間関連情報
Ｃ１１，Ｃ２１，Ｃ２２，Ｃ３１，Ｃ４１，Ｃ４２，Ｃ４３：具象クラス
Ｍ１，Ｍ２，Ｍ３，Ｍ４，Ｍ５：具象メソッド
Ｔ１００：クラス情報テーブル
Ｔ２００：メソッド情報テーブル
Ｔ３００：スーパークラス情報テーブル
Ｔ４００：メソッド関連情報テーブル
Ｔ５００：オブジェクトマスター情報テーブル
Ｔ６００：オブジェクト対インターフェース情報テーブル
Ｔ７００：生成クラス情報テーブル
Ｔ８００：インターフェース対実装情報テーブル
Ｔ９００：メソッド間関連情報テーブル
Ａ，Ｂ，Ｃ：クラス
ＩＡ，ＩＢ：インターフェース
ａ，ｂ，ｍ，ｎ：メソッド
７０：端末
７１：サーバ
７２：データベース（ＤＢ）
７３：ＰＣ
７４：ネットワーク
【図１−１】
2008134699.tif 000003
【図１−２】
2008134699.tif 000004
【図１−３】
2008134699.tif 000005
【図１−４】
2008134699.tif 000006
【図１−５】
2008134699.tif 000007
【図１−６】
2008134699.tif 000008
【図２−１】
2008134699.tif 000009
【図２−２】
2008134699.tif 000010
【図３−１】
2008134699.tif 000011
【図３−２】
2008134699.tif 000012
【図３−３】
2008134699.tif 000013
【図３−４】
2008134699.tif 000014
【図３−５】
2008134699.tif 000015
【図３−６】
2008134699.tif 000016
【図４−１】
2008134699.tif 000017
【図４−２】
2008134699.tif 000018
【図４−３】
2008134699.tif 000019
【図４−４】
2008134699.tif 000020
【図４−５】
2008134699.tif 000021
【図５】
2008134699.tif 000022
【図６−１】
2008134699.tif 000023
【図６−２】
2008134699.tif 000024
【図７−１】
2008134699.tif 000025
【図７−２】
2008134699.tif 000026
【図８−１】
2008134699.tif 000027
【図８−２】
2008134699.tif 000028
【図９】
2008134699.tif 000029
【図１０−１】
2008134699.tif 000030
【図１０−２】
2008134699.tif 000031
【図１１−１】
2008134699.tif 000032
【図１１−２】
2008134699.tif 000033
【図１１−３】
2008134699.tif 000034
【図１１−４】
2008134699.tif 000035
【図１１−５】
2008134699.tif 000036
【図１２−１】
2008134699.tif 000037
【図１２−２】
2008134699.tif 000038
【図１２−３】
2008134699.tif 000039
【図１３−１】
2008134699.tif 000040
【図１３−２】
2008134699.tif 000041
【図１３−３】
2008134699.tif 000042
【図１４−１】
2008134699.tif 000043
【図１４−２】
2008134699.tif 000044
【図１４−３】
2008134699.tif 000045
【図１４−４】
2008134699.tif 000046
【図１４−５】
2008134699.tif 000047
【図１４−６】
2008134699.tif 000048
【図１４−７】
2008134699.tif 000049