(57)【要約】【課題】  ジェネリック型変数が定義されているクラスを決定する改良した技術を提供する。【解決手段】  本発明の１実施例に基づく技術はローカルクラス及び匿名クラスに対するイントロスペクションサポートを提供している。本技術の結果として、ジェネリック型変数を参照するローカル又は匿名のクラス内に定義されていないジェネリック型変数を定義する囲んでいるクラスを決定することが可能である。本発明の１実施例によれば、特定のクラスがローカル又は匿名のクラスであることをコンパイラーが決定する場合に、該コンパイラーは、どのクラスがその特定のクラスを囲んでいるかを表わす情報をその特定のクラスのバイナリークラスファイル内に発する。囲まれているクラスに対応するリフレクティブプロキシに対するメソッドの呼出しに応答して、その囲まれているクラスを囲んでいる囲んでいるクラスを識別する情報が戻される。このことは、その囲まれているクラスが例えローカル又は匿名のクラスであってもそうである。【選択図】      図１
2007012066.tif 000002
【特許請求の範囲】
【請求項１】
ある種のクラスのイントロスペクションを可能とさせる方法において、
第一クラスに対応するリフレクティブプロキシの第一プログラマチックメソッドの呼出しに応答して、該第一クラスを囲む第二クラスを決定し、
該第二クラスを識別する情報を発生し、
該第一クラスが（ａ）該第二クラス内において宣言される第二プログラマチックメソッド内において宣言されるローカルクラス、及び（ｂ）宣言された名前を有するものでない匿名クラスのうちの１つである、
ことを特徴とする方法。
【請求項２】
請求項１において、該第二クラスが該第二クラスのフィールドに対する初期化表現を包含しており、該初期化表現が該第一クラスの宣言を包含していることを特徴とする方法。
【請求項３】
請求項１において、該第二クラスを決定する場合に、該第一クラスに対応しており且つその中に該第二クラスを識別する情報をコンパイラーが発したバイナリークラスファイル内に包含されている情報に基づいて該第二クラスを決定することを特徴とする方法。
【請求項４】
請求項１において、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであるか否かを決定し、且つ
該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする方法。
【請求項５】
請求項１において、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが宣言された名前を有することのない匿名クラスであるか否かを決定し、
該第一クラスが宣言された名前を有することのない匿名クラスであることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする方法。
【請求項６】
請求項１において、更に、
第三クラスに対応するリフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第三クラスが別のクラス内において直接的に宣言されているか否かを決定し、
別のクラス内において該第三クラスが直接的に宣言されていることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする方法。
【請求項７】
命令からなる１つ又はそれ以上のシーケンスを担持する機械読取可能な媒体において、その命令は、１つ又はそれ以上のプロセッサによって実行される場合に、該１つ又はそれ以上のプロセッサをして、
第一クラスに対応するリフレクティブプロキシの第一プログラマチックメソッドの呼出しに応答して、該第一クラスを囲んでいる第二クラスを決定し、
該第二クラスを識別する情報を発生し、
該第一クラスが（ａ）該第二クラス内において宣言されている第二プログラマチックメソッド内において制限されているローカルクラス及び（ｂ）宣言された名前を有することのない匿名クラスのうちの１つである、
上記各ステップを実施させることを特徴とする機械読取可能な媒体。
【請求項８】
請求項７において、該第二クラスが該第二クラスのフィールドに対する初期化表現を包含しており、該初期化表現が該第一クラスの宣言を包含していることを特徴とする機械読取可能な媒体。
【請求項９】
請求項７において、該第二クラスを決定する場合に、該第一クラスに対応しており且つその中にコンパイラーが該第二クラスを識別する情報を発したバイナリークラスファイル内に包含される情報に基づいて該第二クラスを決定することを特徴とする機械読取可能な媒体。
【請求項１０】
請求項７において、該ステップが、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであるか否かを決定し、
該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする機械読取可能な媒体。
【請求項１１】
請求項７において、該ステップが、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが宣言された名前を有することのない匿名クラスであるか否かを決定し、
該第一クラスが宣言された名前を有することのない匿名クラスであることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする機械読取可能な媒体。
【請求項１２】
請求項７において、該ステップが、更に、
第三クラスに対応するリフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第三クラスが別のクラス内において直接的に宣言されているか否かを決定し、
該第三クラスが別のクラス内において直接的に宣言されていることの決定に応答して、該第三プログラマチックメソッドの結果として「真」を戻す、
ことを特徴とする機械読取可能な媒体。
【請求項１３】
第一クラスに対応するリフレクティブプロキシの第一プログラマチックメソッドの呼出しに応答して、該第一クラスを囲んでいる第二クラスを決定するメカニズム、
該第二クラスを識別する情報を発生するメカニズム、
を有しており、該第一クラスが（ａ）該第二クラス内において宣言されている第二プログラマチックメソッド内において宣言されているローカルクラス及び（ｂ）宣言された名前を有することのない匿名クラスのうちの１つであることを特徴とする装置。
【請求項１４】
請求項１３において、該第二クラスが該第二クラスのフィールドに対する初期化表現を包含しており、該初期化表現が該第一クラスの宣言を包含していることを特徴とする装置。
【請求項１５】
請求項１３において、該第二クラスを決定するメカニズムが、該第一クラスに対応しており且つその中にコンパイラーが該第二クラスを識別する情報を発したバイナリークラスファイル内に包含されている情報に基づいて該第二クラスを決定するメカニズムを有していることを特徴とする装置。
【請求項１６】
請求項１３において、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであるか否かを決定するメカニズム、
該第一クラスが該第二クラス内において宣言されている該第二プログラマチックメソッド内において宣言されているローカルクラスであることの決定に応答して該第三プログラマチックメソッドの結果として「真」を戻すメカニズム、
を有していることを特徴とする装置。
【請求項１７】
請求項１３において、更に、
該リフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第一クラスが宣言された名前を有することのない匿名クラスであるか否かを決定するメカニズム、
該第一クラスが宣言された名前を有することのない匿名クラスであることの決定に応答して該第三プログラマチックメソッドの結果として「真」を戻すメカニズム、
を有していることを特徴とする装置。
【請求項１８】
請求項１３において、更に、
第三クラスに対応するリフレクティブプロキシの第三プログラマチックメソッドの呼出しに応答して、該第三クラスが別のクラス内において直接的に宣言されているか否かを決定するメカニズム、
該第三クラスが別のクラス内において直接的に宣言されていることの決定に応答して該第三プログラマチックメソッドの結果として「真」を戻すメカニズム、
を有していることを特徴とする装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はオブジェクト指向型言語に関するものであって、更に詳細には、ローカルクラス及び匿名クラスに対するイントロスペクション（内観）サポート技術に関するものである。
【背景技術】
【０００２】
ジャバ（Ｊａｖａ）開発キット（ＪＤＫ）はジャバプログラミング言語（以後、「ＪＰＬ」と呼称する）プログラムを発生するためのソフトウエア開発キットである。ＪＤＫバージョン１．５はＪＰＬに対して幾つかの拡張を導入している。これらの拡張のうちの１つは「ジェネリック型（ｇｅｎｅｒｉｃ  ｔｙｐｅ）」の導入である。
【０００３】
ＪＰＬにおけるジェネリック型は、全く同じというわけではないが、Ｃ＋＋プログラミング言語におけるテンプレートに類似している。ジェネリック型は、ジェネリック型の使用を有益的なものとさせるシナリオの説明を介して最も容易に理解することが可能である。
【０００４】
ＪＰＬのような強く型付けされたプログラミング言語の構文規則によれば、変数のデータ型はその変数の宣言において表現されるものとされている。以下の宣言が例示的なものである。
【０００５】
【数１】
2007012066.tif 000003
【０００６】
上の宣言において、変数「ｘ」は型「Ｉｎｔｅｇｅｒ」のものと宣言されている。従って、「ｘ」に対して「Ｉｎｔｅｇｅｒ」クラス又はそのサブクラスのインスタンスではないオブジェクトを割当てることの試みは禁止されるべきであり且つその割当てにおいて何かが誤っていることをコンパイラーをしてプログラマーに警告させるべきである。
【０００７】
以下の宣言は幾分より洗練されており且つ知識を与えるものである。
【０００８】
【数２】
2007012066.tif 000004
【０００９】
上の宣言において、変数「ｍｙＩｎｔＬｉｓｔ」は型「Ｌｉｓｔ」のものと宣言されている。上の表現が評価されると、「ＬｉｎｋｅｄＬｉｓｔ（）」コンストラクターメソッドの呼出しを介して「ＬｉｎｋｅｄＬｉｓｔ」クラスの新たなインスタンス（即ち、「ＬｉｎｋｅｄＬｉｓｔ」オブジェクト）が形成され（インスタンス化され）且つ「ｍｙＩｎｔＬｉｓｔ」へ割当てられる。これらの「Ｌｉｓｔ」及び「ＬｉｎｋｅｄＬｉｓｔ」クラスは以下の説明における例として使用するが、以下に説明するクラスの挙動はこれらのクラスにのみ制限されるものではないことを理解すべきである。
【００１０】
特定の型の変数にはその特定の型のサブタイプ（ｓｕｂｔｙｐｅ）即ち下位型であるオブジェクトを割当てることが可能である。型「Ｌｉｓｔ」のその他の変数のように、変数「ｍｙＩｎｔＬｉｓｔ」は「ＬｉｎｋｅｄＬｉｓｔ」オブジェクトを割当てることが可能である。何故ならば、型「ＬｉｎｋｅｄＬｉｓｔ」は型「Ｌｉｓｔ」のサブタイプ即ち下位型だからである。「ＬｉｎｋｅｄＬｉｓｔ」オブジェクトは他のオブジェクトのリンクされたリストである。ＪＰＬにおいてジェネリック型を導入する前には、コンパイラーは、これらの他のオブジェクトの特定の型が何であったかを決定することは不可能であった。型システムはランタイム挙動の保守的な近似である。例えば、ジェネリック型でない場合には、「Ｆｏｏ」型オブジェクトのみがＬｉｎｋｅｄＬｉｓｔ内に「挿入」された場合には、ＬｉｎｋｅｄＬｉｓｔからこれらのオブジェクトを「抽出」した場合に、コンパイラーは、該オブジェクトが型「Ｆｏｏ」のものであったことを決定することは不可能である。ジェネリック型がない場合には、これらのオブジェクトは「Ｏｂｊｅｃｔ」クラスの何等かの決定不可能な下位型のインスタンスであったことをコンパイラーが決定することが可能であるに過ぎず、ＪＰＬにおいては、全てのクラスは「Ｏｂｊｅｃｔ」クラスのサブクラスである。これは、コンパイラーが得ることが可能な特定の限界であったので、「抽出された」オブジェクトはそれらに対して呼び出された「Ｏｂｊｅｃｔ」クラス（「Ｆｏｏ」クラスと対比して）のメソッドを有することが可能であるに過ぎない。
【００１１】
この欠点のために、特定のデータ型のものであると宣言されていた変数に対してそのオブジェクトを割当てる前にこのように戻されたオブジェクトを特定のデータ型へプログラマーが「キャスト」することがしばしば必要となった。以下のコードがそのことを示している。
【００１２】
【数３】
2007012066.tif 000005
【００１３】
上のコードにおいて、該メソッドにより戻される「Ｏｂｊｅｃｔ」型オブジェクトはクラス「Ｉｎｔｅｇｅｒ」のインスタンス内に明示的にキャストされる。このキャストが実施されなかった場合には、非「Ｉｎｔｅｇｅｒ」型オブジェクトが型「Ｉｎｔｅｇｅｒ」の変数に対して割当てられていることをコンパイラーが非難する場合がある。勿論、このような非難は有益的なものである。何故ならば、コンパイラーがこのような割当てに対して非難しなかった場合には、そのメソッドが実際にはＩｎｔｅｇｅｒ即ち整数ではないオブジェクトを戻した場合及びその時にコンパイルされたプログラムは予測されず且つ不所望な挙動を示す場合がある。
【００１４】
このような態様でオブジェクトをキャストせねばならないことは、通常、プログラマーを苛立たせ且つソースコードを不所望に冗長なものとさせ且つ読みにくいものとさせる。キャストすることは「ダーティ」即ち汚らわしいプログラミング手法であると考える者もいる。幸運なことに、ＪＰＬにおいてのジェネリック型の出現は、少なくとも、上述した目的のために、キャストすることを不必要なものとさせている。ジェネリック型を組込んだサンプルの宣言は以下の通りである。
【００１５】
【数４】
2007012066.tif 000006
【００１６】
これは、「ｍｙＩｎｔＬｉｓｔ」に割当てられたリンクされたリスト内のオブジェクトがクラス「Ｉｎｔｅｇｅｒ」のインスタンスとなるということをこの宣言が明示的に示している点を除いて、上の非ジェネリック型宣言と類似している。この宣言に鑑み、コンパイラーは「ｍｙＩｎｔＬｉｓｔ．ｉｔｅｒａｔｏｒ（）．ｎｅｘｔ（）」メソッドにより戻される全てのオブジェクトが「Ｉｎｔｅｇｅｒ」オブジェクトであることを知得する。コンパイラーは以下の表現について非難するものではない。
【００１７】
【数５】
2007012066.tif 000007
【００１８】
何故ならば、コンパイラーは、該メソッドにより戻されるオブジェクトが「Ｉｎｔｅｇｅｒ」オブジェクトでなければならないこと、及び変数「ｘ」が型「Ｉｎｔｅｇｅｒ」のオブジェクトを参照することが可能であることを決定することが可能だからである。単一の宣言が潜在的に多数のキャストを不必要なものとさせる。
【００１９】
更に注意すべきことであるが、ジェネリック型は、クラスの複数の別個のインプリメンテーション（ｉｍｐｌｅｍｅｎｔａｔｉｏｎ）を必要とすることなしに、このような態様における特定性を可能とさせる。「ｍｙＩｎｔＬｉｓｔ」は「Ｉｎｔｅｇｅｒ」オブジェクトを参照する「Ｌｉｓｔ」オブジェクトであるが、プログラマーは「Ｉｎｔｅｇｅｒ」オブジェクトのみを参照するために「Ｌｉｓｔ」クラスのインプリメンテーションを特にコード化することは必要ではない。ジェネリック型はジェネリックな態様でクラスを一度定義させ、次いで異なる特定の宣言において複数回呼び出させることを可能とする。
【００２０】
ジェネリック型が提供するランタイム挙動のより精密な近似に起因して、ジェネリック型は、又、ランタイム障害を回避することに貢献する。
【００２１】
ジェネリック型宣言の実際の１つの例を以下に示す。
【００２２】
【数６】
2007012066.tif 000008
【００２３】
上のジェネリック型宣言においては、山型括弧で囲まれたパラメータ（例えば、「＜Ｅ＞」）はジェネリック型の「仮型パラメータ（ｆｏｒｍａｌ  ｔｙｐｅ  ｐａｒａｍｅｔｅｒ）」と呼ばれる。このようなジェネリック型の特定の呼出しは「パラメータ化された型（ｐａｒａｍｅｔｅｒｉｚｅｄ  ｔｙｐｅ）」と呼ばれる。例えば、以下の表現はパラメータ化された型である。
【００２４】
【数７】
2007012066.tif 000009
【００２５】
前述したパラメータ化された型において、「＜Ｉｎｔｅｇｅｒ＞」は「実型引数」の１例である。パラメータ化された型は、そのジェネリック型宣言が呼び出される場合に仮型パラメータの場所に配置されるべき実型引数を特定する。以下に提供する例は１つの仮型パラメータのみ及び１つの実型引数のみを包含するものであるが、ジェネリック型は複数の仮型パラメータを特定することが可能であり且つパラメータ化された型は複数の実型引数を特定することが可能であることを理解すべきである。
【００２６】
ＪＰＬジェネリック型及びＣ＋＋テンプレートは構文的及び機能的に幾分類似しているものであるが、これら２つの間には幾つかの顕著な差異が存在している。ＪＰＬジェネリック型の宣言は、異なる実型引数に対し複数の異なる特定の宣言に展開されることはない。その代わりに、ＪＰＬにおける非ジェネリック型宣言の場合におけるように、ＪＰＬジェネリック型宣言は単一のクラスファイル内にコンパイルされる。
【００２７】
ジェネリック型は非常に有用なものであるから、ＪＰＬライブラリ内に存在していた非ジェネリック型宣言の多くがジェネリック型宣言で置換されている。非ジェネリックメソッド宣言もこれらのライブラリにおいてジェネリックメソッド宣言で置換されている。換言すると、以前の非ジェネリック型及びメソッド宣言は「ジェネリック化」されている。既存のライブラリは移行互換性を可能とする態様でジェネリック化されている。新たなＪＰＬプログラムを書いているプログラマーは、そのプログラムにパラメータ化された型をいれることによりジェネリック型及びメソッドを利用することが可能である。
【００２８】
クラス分類
クラスは、幾分、それらのクラスが他のクラスと相対的に宣言される箇所に基づく分類に従って類別することが可能である。幾つかのクラスはトップレベル（ｔｏｐ−ｌｅｖｅｌ）クラスであり、且つ幾つかのクラスはネストしたクラス（ｎｅｓｔｅｄ  ｃｌａｓｓ）である。トップレベルクラスは、その他のクラス内において宣言されることのないクラスである。対照的に、ネストしたクラスは、別のクラス内において宣言されているクラスであるが、多分、最も直接的なレベルにおいて宣言されるものではない。
【００２９】
ネストしたクラスは、更に、名前が付けられているか及び別のクラス内において直接的に宣言されているかに基づいて更に類別することが可能である。名前が付けられており且つ別のクラス内において直接的に宣言されているネストしたクラスは「メンバークラス」と呼ばれる。メンバークラスが直接的に宣言されている（即ち、下方に１つのレベルを超えることなく宣言されている）クラスは、そのメンバークラスに対して「宣言するクラス」である。換言すると、メンバークラスは、メソッド及びフィールドが宣言するクラスのメンバーである場合があるのと殆ど同じ態様で、メンバークラスはその宣言するクラスの「メンバー」である。
【００３０】
幾つかのネストしたクラスは「メンバー」クラスではない。例えば、幾つかのネストしたクラスは別のクラス内に包含されている何等かのメソッド内において宣言されている。第一クラスが第二クラス内に包含されているメソッド内に宣言されている場合には、その第二クラスはその第一クラスに対して「宣言する」クラスではない。何故ならば、その第一クラスはその第二クラス内において直接的に宣言されていないからである。このような環境下において、その第二クラスはその第一クラスの「宣言する」クラスではないが、その第二クラスは未だにその第一クラスの「囲む（ｅｎｃｌｏｓｉｎｇ）」クラスであり、その第一クラスはその第二クラス内に包含されているが、その第二クラス内において直接的に宣言されているものではない。
【００３１】
これらの非メンバークラスの中で、クラスの２つの更なるサブカテゴリがあり、即ちローカルクラスと匿名クラスである。ローカルクラスは、メソッド宣言等のコードの直接実行可能ブロック内において宣言される。匿名クラスは宣言された名前を有することのないクラスである。
【００３２】
下の例示的なコードにおいて、クラス「Ｌｏｃａｌ」はローカルクラスである。何故ならば、それはクラス「Ｔｏｐ」の宣言内において直接的にではなくメソッド「ｆｏｏ」の宣言内において宣言されているからである。クラス「Ｔｏｐ」は未だにクラス「Ｌｏｃａｌ」をエンクローズ（ｅｎｃｌｏｓｅ）即ち囲んでいる。
【００３３】
【数８】
2007012066.tif 000010
【００３４】
次の下の例は１つのメソッド「ｂａｒ（）」を有する匿名クラスの１例を例示している。
【００３５】
【数９】
2007012066.tif 000011
【００３６】
型変数を包含する囲むクラスの変数は囲まれたクラスの範囲内に包含されており、従ってその囲まれたクラス及びそのメンバーはこのような変数を参照することが許される。
【００３７】
イントロスペクション
ランタイムにおいて稼動中のプログラムの要素の特性を決定する方法をプログラムが有することが有用であることがしばしばある。このような特性を決定することの能力を「イントロスペクション（ｉｎｔｒｏｓｐｅｃｔｉｏｎ）」即ち内観と呼ばれる。ＪＤＫコアリフレクション（Ｃｏｒｅ  Ｒｅｆｌｅｃｔｉｏｎ）アプリケーションプログラミングインターフェース（ＡＰＩ）は現在のＪＰＬ仮想マシン（ＪＶＭ）におけるクラスに関してのイントロスペクションをサポートしている。コアリフレクションＡＰＩは、又、新たなクラスインスタンス及び新たな配列を構築し、オブジェクト及びクラスのフィールドへアクセスし且つ修正し、オブジェクト及びクラスに関してのメソッドを呼出し、配列の要素をアクセスし且つ修正するために使用することが可能である。コアリフレクションＡＰＩのメカニズムは、あるプログラム要素（例えば、クラス、フィールド、メソッド等）がこれらのプログラム要素に関する情報を表わす対応する「リフレクティブプロキシ（ｒｅｆｌｅｃｔｉｖｅ  ｐｒｏｘｙ）」を有することを可能とさせる。
【００３８】
例えば、コアリフレクションＡＰＩのあるメソッドはそのメソッドの仮パラメータの型、又はそのメソッドの戻り型を包含するメソッドのシグネチャに関する情報を戻す。このような情報は、ジェネリック型パラメータの数及び名前等のジェネリック型特定情報を包含することが可能である。
【００３９】
クラスはそのクラスの外側で定義されているジェネリック型変数を参照することが可能であるので、特定のジェネリック型変数が定義されているクラスを決定する態様を有することが有用である。コアリフレクションＡＰＩは「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」と呼ばれるメソッドを実装している。メンバークラスに対応するリフレクティブプロキシに対して呼び出されると、「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドはそのメンバークラスの宣言するクラスに対応するリフレクティブプロキシを戻す。そのメンバークラスがその宣言するクラスにおいて定義されているジェネリック型変数を参照すると、「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドは、そのジェネリック型変数が定義されたクラスを決定するために使用することが可能である。その宣言するクラスがそのジェネリック型変数を定義すると、その宣言するクラスに対応するリフレクティブプロキシがこの事実を表示する。そうでない場合には、「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドは、そのリフレクティブプロキシに対して呼出し、１つの「クラスレベル」より高く移行することが可能である。多くの場合において、このプロセスは、そのジェネリック型変数を定義するクラスが決定されるまで継続される場合がある。
【００４０】
然しながら、幾つかの場合においては、このプロセスは特定のジェネリック型変数が定義されたクラスを決定するために使用することは不可能である。「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドがローカル又は匿名のクラスに対応するリフレクティブプロキシに対して呼び出されると、「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドは「ヌル（ｎｕｌｌ）」を戻す。これは全く正しい結果である。何故ならば、上述したように、ローカルクラス及び匿名クラスは１つのクラス内において直接的に宣言されるものではなく、従って、このようなクラスに対しての宣言するクラスは存在していないからである。
【発明の開示】
【発明が解決しようとする課題】
【００４１】
従って、ローカル又は匿名のクラスがそのクラスの外側で定義されているジェネリック型変数を参照する場合に、「ｇｅｔＤｅｃｌａｒｉｎｇＣｌａｓｓ（）」メソッドは、そのジェネリック型変数が定義されているクラスを決定する何等かの態様を提供するものではない。
【００４２】
本発明は、以上の点に鑑みなされたものであって、上述した如き従来技術の欠点を解消し、ジェネリック型変数が定義されているクラスを決定するための改良した技術を提供することを目的とする。
【００４３】
本発明の別の目的とするところは、ローカルクラス及び匿名クラスに対する改良したイントロスペクションサポート技術を提供することである。
【課題を解決するための手段】
【００４４】
本発明の１実施例によれば、ローカルクラス及び匿名クラスに対するイントロスペクションサポートを提供する技術が提供される。この技術の結果として、ジェネリック型変数を参照するローカル又は匿名のクラス内において定義されているものではないジェネリック型変数を定義するクラスを決定することが可能である。
【００４５】
本発明の１実施例によれば、「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」と呼ばれるメソッドがインプリメント即ち実装される。囲まれているクラスに対応するリフレクティブプロキシに対しての「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドの呼出しに応答して、その囲まれているクラスを囲んでいる囲むクラスを識別する情報が戻される。このことは、囲まれているクラスがローカルクラス又は匿名クラスの場合であってもそうである。本発明の１実施例においては、囲んでいるクラスのリフレクティブプロキシが、どのジェネリック型変数がその囲んでいるクラスにより定義されているかを表わす情報を包含している。
【００４６】
本発明の１実施例によれば、特定のクラスがローカル又は匿名のクラスであることをコンパイラーが決定する場合には、該コンパイラーは、その特定のクラスのバイナリークラスファイル内に、その特定のクラスを囲んでいる囲んでいるクラスのアイデンティティを表わす情報を発する。その特定のクラスのバイナリークラスファイルにおける該情報は、「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドがその特定のクラスの囲んでいるクラスを決定することを可能とするためにランタイムにおいて使用することが可能である。
【発明を実施するための最良の形態】
【００４７】
本発明の１実施例によれば、ローカルクラス及び匿名クラスに対するイントロスペクションをサポートする技術が提供される。本発明の１実施例の動作のハイレベルの概観を例示した動作フローチャートを図１に示してある。
【００４８】
図１を参照すると、ブロック１０２において、リフレクティブプロキシの「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドの呼出しが検知される。該リフレクティブプロキシはローカルクラスか又は匿名クラスである場合がある囲まれたクラス（ｅｎｃｌｏｓｅｄ  ｃｌａｓｓ）に対応している。例えば、仮想マシンのランタイム環境はこのようなメソッドの呼出しを検知する場合がある。そのメソッドの名前「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」が説明の便宜上使用されているが、本発明の実施例は「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」に関連してここで説明するものと同一の動作を実施するメソッドに対し異なる名前を使用することが可能である。
【００４９】
ブロック１０４において、「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドの呼出しに応答して、その囲まれているクラスを囲んでいる囲んでいるクラス（ｅｎｃｌｏｓｉｎｇ  ｃｌａｓｓ）が決定される。例えば、ランタイム環境は、その囲まれているクラスに対応するバイナリークラスファイルからこのような情報を決定することが可能である。
【００５０】
ブロック１０６において、その囲んでいるクラスを識別する情報が発生される。該情報は「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドの結果としてリターン即ち戻すことが可能である。例えば、ランタイム環境は該情報を発生し且つリターン即ち戻すことが可能である。
【００５１】
１実施例においては、その囲んでいるクラスのリフレクティブプロキシが、他の情報の中で、その囲んでいるクラスを定義するジェネリック型変数を表示する。従って、囲んでいるクラスのリフレクティブプロキシの特定のメソッド（例えば、メソッド「ｔｏＧｅｎｅｒｉｃＳｔｒｉｎｇ」）の呼出しに応答して、これらのジェネリック型変数を包含する情報がランタイムにおいて戻される。
【００５２】
その他の観点において、本発明は、ある実施例においては、コンピュータ装置、コンピューティングシステム、及び前述した技術を実施すべく構成されたコンピュータにより読取可能な媒体を包含している。
【００５３】
コンパイル時に囲んでいるクラスの情報を発する
本発明の１実施例においては、ランタイム環境が、囲まれているクラスに対応するバイナリークラスファイル内に格納されている情報に基づいてローカルクラス又は匿名クラスの囲んでいるクラスを決定する。各クラスは別個の対応するバイナリークラスファイルを有している。本発明の１実施例によれば、コンパイラーが、囲まれているクラスがローカル又は匿名のクラスであることの決定に応答してバイナリークラスファイル内に囲んでいるクラスのアイデンティティを格納する。
【００５４】
図２は本発明の１実施例に基づいて、コンパイル時において囲んでいるクラスのアイデンティティ情報を発する技術の１例を例示しているフローチャートである。コンパイラーは、例えば、このような技術を実施することが可能である。
【００５５】
ブロック２０２において、クラス宣言が検知される。ブロック２０４において、そのクラス宣言がローカルクラス又は匿名クラスの宣言であるか否かが決定される。そのクラス宣言がローカルクラス又は匿名クラスの宣言である場合には、制御がブロック２０６へパスする。そうでない場合には、制御はブロック２０８へパスする。
【００５６】
ブロック２０６において、そのローカル又は匿名のクラスの囲んでいるクラスを識別する情報がそのローカル又は匿名のクラスに対するバイナリークラスファイル内に発せられる。該情報は、そのローカル又は匿名のクラスに対応するリフレクティブプロキシの「ｇｅｔＥｎｃｌｏｓｉｎｇＣｌａｓｓ（）」メソッドの呼出しに応答してランタイム環境によりアクセスすることが可能である。
【００５７】
一方、ブロック２０８において、その囲んでいるクラスを識別する情報は、その宣言がブロック２０２において検知された囲まれているクラスに対するバイナリークラスファイル内に発せられることない。
【００５８】
本発明の１実施例によれば、特定の名前が付けられたクラスの宣言が別のクラスの宣言内に包含されているメソッド宣言内に包含されている場合には、その特定のクラスの宣言はローカルクラス宣言であると決定される。
【００５９】
本発明の１実施例によれば、特定のクラスが名前無しで宣言されている場合には、その特定のクラスの宣言は匿名クラス宣言であると決定される。
【００６０】
匿名クラス宣言は囲んでいるクラスのフィールドに対する初期化表現内に包含させることが可能である。以下のコードの例においては、匿名クラスがクラス「Ｆｏｏ」のメンバーであるフィールド「ｔ」に対する初期化表現内において宣言されている。
【００６１】
【数１０】
2007012066.tif 000012
【００６２】
ローカル又は匿名のクラスが複数のクラス内にネスト（入れ子）されている場合がある。例えば、ローカル又は匿名のクラスはクラス「Ｆｏｏ」内にネストされている場合があり、そのクラスはクラス「Ｂａｒ」内にネストされている場合があり、そのクラスはクラス「Ｂａｚ」内にネストされている場合がある。本発明の１実施例によれば、ローカル又は匿名のクラスに対する囲んでいるクラスは、そのクラスを最も直接的に囲んでいるクラスである。前の例において、匿名クラスの最も直接的に囲んでいるクラスは「Ｆｏｏ」である。
【００６３】
バイナリークラスフィルタ構造の例
上述したように、本発明の１実施例においては、コンパイラーは、例えこの囲んでいるクラスがローカル又は匿名クラスに対する「宣言する」クラスではなくとも、そのローカル又は匿名のクラスを囲んでいるクラスを識別する情報をそのローカル又は匿名クラスに対応するバイナリークラスファイル内に発する。本発明の１実施例によれば、該バイナリークラスファイルは以下の形態の構造を包含しており、その場合に、型「ｕ２」及び「ｕ４」は２及び４バイト長の符号無し数字に対する型を表わしている（本明細書で説明する型及び定数に関しての付加的な情報及び定義については、Ｔｉｍ  Ｌｉｎｄｈｏｌｍ及びＦｒａｎｋ  Ｙｅｌｌｉｎによるジャバ仮想マシン明細第二版（Ｔｈｅ  Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ，２  ｅｄ．）を参照すると良く、その文献の開示内容全てを引用により本明細書に取込む）。
【００６４】
【数１１】
2007012066.tif 000013
【００６５】
「ａｔｔｒｉｂｕｔｅ ｉｎｆｏ」フィールドは属性テーブルを包含している。該属性テーブルの各値は属性構造である。本発明の１実施例によれば、各属性は以下の形態の構造である。
【００６６】
【数１２】
2007012066.tif 000014
【００６７】
「ａｔｔｒｉｂｕｔｅ ｎａｍｅ ｉｎｄｅｘ」はそのクラスの定数プール内へのインデックスである。このインデックスにおける「ｃｏｎｓｔａｎｔ ｐｏｏｌ」エントリはその属性の名前を表わす構造である。本明細書で説明する構造の幾つかに関しての付加的な情報については、前述したジャバ仮想マシン明細の文献を参照すると良い。
【００６８】
本発明の１実施例によれば、属性テーブル内に包含させることが可能な属性の１つの種類は「ＥｎｃｌｏｓｉｎｇＭｅｔｈｏｄ」属性である。本発明の１実施例によれば、ローカルクラス及び匿名クラスのみが「ＥｎｃｌｏｓｉｎｇＭｅｔｈｏｄ」属性を有している。本発明の１実施例によれば、「ＥｎｃｌｏｓｉｎｇＭｅｔｈｏｄ」属性は以下のフォーマットを有している。
【００６９】
【数１３】
2007012066.tif 000015
【００７０】
「ａｔｔｒｉｂｕｔｅ ｎａｍｅ ｉｎｄｅｘ」は「ｃｏｎｓｔａｎｔ ｐｏｏｌ」テーブル内での有効なインデックスである。「ｃｏｎｓｔａｎｔ ｐｏｏｌ」エントリはストリング「ＥｎｃｌｏｓｉｎｇＭｅｔｈｏｄ」を表わす構造である。上述した実施例において、「ａｔｔｒｉｂｕｔｅ ｌｅｎｇｔｈ」の値は４である。
【００７１】
「ｃｌａｓｓ ｉｎｄｅｘ」項目は「ｃｏｎｓｔａｎｔ ｐｏｏｌ」テーブル内への有効なインデックスである。そのインデックスにおけるエントリは現在のクラスの宣言を囲んでいる最も内側のクラスを表わす「ＣＯＮＳＴＡＮＴ Ｃｌａｓｓ ｉｎｆｏ」構造である。本発明の１実施例によれば、ローカル又は匿名のクラスに対する囲んでいるクラス情報を識別する情報をコンパイラーが発するのはこの構造内へである。本発明の１実施例においては、「ＣＯＮＳＴＡＮＴ Ｃｌａｓｓ ｉｎｆｏ」構造は以下の形式を有している。
【００７２】
【数１４】
2007012066.tif 000016
【００７３】
１実施例においては、「ＴＡＧ」項目は値「ＣＯＮＳＴＡＮＴ Ｃｌａｓｓ」を有しており（前述したジャバ仮想マシン明細の文献に更に定義されているように）、且つ「ｎａｍｅ ｉｎｄｅｘ」の値は「ｃｏｎｓｔａｎｔ ｐｏｏｌ」テーブル内への有効なインデックスである。１実施例においては、そのインデックスにおけるエントリは、符号化することが可能な有効な完全に資格が与えられたクラス又はインターフェース名を表わす構造である。
【００７４】
付加的なイントロスペクションメソッド
本発明の１実施例によれば、各リフレクティブプロキシは「ｇｅｔＳｉｍｐｌｅＮａｍｅ（）」メソッドをインプリメント即ち実装し、それは、呼び出されると、そのリフレクティブプロキシに対応するクラスの単純な名前を戻す。
【００７５】
本発明の１実施例によれば、各リフレクティブプロキシは「ｇｅｔＣａｎｏｎｉｃａｌ  Ｎａｍｅ（）」メソッドを実装し、それは呼び出されると、ＪＰＬ明細によって定義されるように、そのリフレクティブプロキシに対応するクラスのカノニカル（ｃａｎｏｎｉｌａｌ）名を戻す。
【００７６】
本発明の１実施例によれば、各リフレクティブプロキシは「ｉｓＡｎｏｎｙｍｏｕｓＣｌａｓｓ（）」メソッドを実装しており、それは、呼び出されると、そのリフレクティブプロキシに対応するクラスが匿名クラスである場合に「真」を戻し、且つそうでない場合に「偽」を戻す。
【００７７】
本発明の１実施例によれば、各リフレクティブプロキシは「ｉｓＬｏｃａｌＣｌａｓｓ（）」メソッドを実装し、それは、呼び出されると、そのリフレクティブプロキシに対応するクラスがローカルクラスである場合に「真」を戻し、且つそうでない場合には、「偽」を戻す。
【００７８】
本発明の１実施例によれば、各リフレクティブプロキシは「ｉｓＭｅｍｂｅｒＣｌａｓｓ（）」メソッドを実装し、それは、呼び出されると、そのリフレクティブプロキシに対応するクラスがメンバークラス（即ち、「宣言する」クラス内において直接的に宣言されているクラス）である場合に「真」を戻し、且つそうでない場合に「偽」を戻す。
【００７９】
ハードウエア概観
図３は、本発明の１実施例を実装させることが可能なコンピュータシステム３００を例示したブロック図である。コンピュータシステム３００は、情報交換を簡単化させるためのバス３０２、及び情報を処理するためにバス３０２と結合されている１個又はそれ以上のプロセッサ３０４を包含している。コンピュータシステム３００は、又、ランダムアクセスメモリ（ＲＡＭ）又はその他のダイナミック格納装置等のメインメモリ３０６を包含しておりそれはプロセッサ３０４により実行されるべき命令及び情報を格納するためにバス３０２に結合されている。メインメモリ３０６は、又、プロセッサ３０４による命令の実行期間中に一次的な変数又はその他の中間情報を格納するために使用することが可能である。コンピュータシステム３００は、更に、プロセッサ３０４に対する静的情報及び命令を格納するためにバス３０２に結合されているリードオンリメモリ（ＲＯＭ）３０８又はその他のスタチック格納装置を包含することが可能である。磁気ディスク又は光学的ディスク等の格納装置３１０が情報及び命令を格納するために設けられており且つバス３０２へ結合されている。
【００８０】
コンピュータシステム３００は、コンピュータユーザに対し情報を表示するために陰極線管（ＣＲＴ）等のディスプレイ３１２へバス３０２を介して結合させることが可能である。英文字又はその他のキーを包含する入力装置３１４がプロセッサ３０４に対し情報及びコマンド選択を通信するためにバス３０２へ結合されている。別のタイプのユーザ入力装置は、マウス、トラックボール、又は指示情報及びコマンド選択をプロセッサ３０４へ通信し且つディスプレイ３１２上のカーソルの動きを制御するためのカーソル方向キー等のカーソル制御器３１６である。この入力装置は、典型的に、２つの軸、即ち第一軸（例えばｘ）及び第二軸（例えばｙ）において２つの自由度を有しており、それは該装置が面内における位置を特定することを可能とする。
【００８１】
コンピュータシステム３００において、バス３０２は種々のコンポーネント間において、情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体とすることが可能である。例えば、バス３０２は電気的信号を担持する１組の導体とすることが可能である。バス３０２は、又、コンポーネントの１つ又はそれ以上の間でワイヤレス信号を担持するワイヤレス媒体（例えば、空気）とすることが可能である。バス３０２は、又、コンポーネントの１つ又はそれ以上の間で信号を容量的に交換させることを可能とする媒体（例えば、空気）とすることが可能である。バス３０２は、更に、コンポーネントの１つ又はそれ以上を接続するネットワーク接続とすることが可能である。相対的に、種々のコンポーネントの間において情報、信号、データ等を交換させることを可能とする任意のメカニズム及び／又は媒体をバス３０２として使用することが可能である。
【００８２】
バス３０２は、又、これらのメカニズム／媒体の結合とすることが可能である。例えば、プロセッサ３０４はワイヤレスにより格納装置３１０と通信することが可能である。このような場合には、バス３０２は、プロセッサ３０４及び格納装置３１０の観点からは、空気等のワイヤレス媒体である。更に、プロセッサ３０４は容量的にＲＯＭ３０８と通信することが可能である。この場合には、バス３０２はこの容量的通信を行うことを可能とする媒体（例えば、空気）である。更に、プロセッサ３０４はネットワーク接続を介してメインメモリ３０６と通信することが可能である。この場合には、バス３０２はネットワーク接続である。更に、プロセッサ３０４は１組の導体を介してディスプレイ３１２と通信することが可能である。この場合には、バス３０２は１組の導体である。従って、どのようにして種々のコンポーネントが互いに通信するかに依存して、バス３０２は異なる形態をとることが可能である。バス３０２は、図３に示したように、種々のコンポーネント間において情報、信号、データ等を交換させることを可能とする全てのメカニズム及び／又は媒体を機能的に表わしている。
【００８３】
本発明は本明細書に記載した技術を実装するためのコンピュータシステム３００の使用に関連している。本発明の１実施例によれば、これらの技術は、メインメモリ３０６内に包含されている１つ又はそれ以上の命令からなる１つ又はそれ以上のシーケンスを実行するプロセッサ３０４に応答してコンピュータシステム３００により実施される。このような命令は、格納装置３１０等の別の機械読取可能な媒体からメインメモリ３０６内に読込むことが可能である。メインメモリ３０６内に包含されている命令シーケンスの実行は、プロセッサ３０４をして、本明細書に記載した処理ステップを実施させる。別の実施例においては、本発明を実現するためにソフトウエア命令と結合させるか又その代わりにハードワイヤード回路を使用することが可能である。従って、本発明の実施例は、ハードウエア回路及びソフトウエアの何等かの特定的な結合に制限されるものではない。
【００８４】
本明細書において使用されているように「機械読取可能な媒体」という用語は、マシンをして特定の態様で動作させるデータを供給することに関与する任意の媒体のことを意味している。コンピュータシステム３００を使用して実現される実施例においては、種々の機械読取可能な媒体が、例えば、実行のためにプロセッサ３０４へ命令を供給する場合に関与する。このような媒体は、これらに制限されるものではないが、非揮発性媒体、揮発性媒体、伝送媒体を包含する多くの形態をとることが可能である。非揮発性媒体は、例えば、格納装置３１０等の光学的又は磁気的ディスクを包含している。揮発性媒体は、メインメモリ３０６等のダイナミックメモリを包含している。伝送媒体は、バス３０２を構成するワイヤを包含して、同軸ケーブル、銅ワイヤ及びオプティカルファイバーを包含している。伝送媒体は、又、無線及び赤外線データ通信期間中に発生されるもの等の音響的又は光波の形態をとることが可能である。
【００８５】
機械読取可能な媒体の一般的な形態は、例えば、フロッピィディスク、フレキシブルディスク、ハードディスク、磁気テープ、又は任意のその他の磁気媒体、ＣＤ−ＲＯＭ、任意のその他の光学的媒体、パンチカード、紙テープ、孔のパターンを具備する任意のその他の物理的媒体、ＲＡＭ、ＰＲＯＭ、ＥＰＲＯＭ、フラッシュＥＰＲＯＭ、任意のその他のメモリチップ又はカートリッジ、後に説明するような搬送波、又はそれからコンピュータが読取ることが可能な任意のその他の媒体を包含している。
【００８６】
機械読取可能な媒体の種々の形態は、実行のためにプロセッサ３０４へ１つ又はそれ以上の命令からなる１つ又はそれ以上のシーケンスを担持する場合に関与される場合がある。例えば、該命令は、初期的には、遠隔コンピュータの磁気ディスク上に担持されている場合がある。その遠隔コンピュータは命令をそのダイナミックメモリ内にロードし且つ該命令をモデムを使用して電話線を介して送ることが可能である。コンピュータシステム３００に対してローカルなモデムが電話線を介してそのデータを受取り且つそのデータを赤外線信号へ変換するために赤外線送信器を使用することが可能である。赤外線検知器は赤外線信号内に担持されるデータを受取ることが可能であり且つ適宜の回路がそのデータをバス３０２上に配置させることが可能である。バス３０２はそのデータをメインメモリ３０６へ運び、そこからプロセッサ３０２が該命令を検索し且つ実行する。メインメモリ３０６により受取られた命令は、オプションとして、プロセッサ３０２による実行の前又は後のいずれかにおいて格納装置３１０上に格納させることが可能である。
【００８７】
コンピュータシステム３００は、又バス３０２へ結合されている通信インターフェース３１８を包含している。通信インターフェース３１８はローカルネットワーク３２２へ接続されているネットワークリンク３２０に対し二方向データ通信カップリングを与える。例えば通信インターフェース３１８は対応するタイプの電話線に対するデータ通信接続を提供する統合サービスデジタルネットワーク（ＩＳＤＮ）カード又はモデムとすることが可能である。別の例として、通信インターフェース３１８は、互換性のあるＬＡＮに対しデータ通信接続を与えるローカルエリアネットワーク（ＬＡＮ）カードとすることが可能である。ワイヤレスリンクを実現することも可能である。いずれかのこのような実現において、通信インターフェース３１８は種々のタイプの情報を表わすデジタルデータストリームを担持する電気的、電磁的又は光学的信号を送り且つ受取る。
【００８８】
ネットワークリンク３２０は、典型的に、１つ又はそれ以上のネットワークを介してその他のデータ装置に対しデータ通信を提供する。例えば、ネットワークリンク３２０はローカルネットワーク３２２を介してホストコンピュータ３２４に対し又はインターネットサービスプロバイダー（ＩＳＰ）３２６により操作されているデータ装置に対し接続を与えることが可能である。ＩＳＰ３２６は現在一般的に「インターネット」３２８と呼称されているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供している。ローカルネットワーク３２２及びインターネット３２８は、両方共、デジタルデータストリームを担持する電気的、電磁的又は光学的信号を使用する。種々のネットワークを介しての信号及びコンピュータシステム３００へ及びそれからの及びそれからデジタルデータを担持するネットワーク３２０上及び通信インターフェース３１８を介しての信号は、情報を輸送する搬送波の例示的な形態である。
【００８９】
コンピュータシステム３００はネットワーク、ネットワークリンク３２０及び通信インターフェース３１８を介してメッセージを送り且つプログラムコードを包含するデータを受取ることが可能である。インターネットの例においては、サーバー３３０はインターネット３２８、ＩＳＰ３２６、ローカルネットワーク３２２、通信インターフェース３１８を介してアプリケーションプログラムに対して要求されたコードを送信する場合がある。
【００９０】
プロセッサ３０４は、コードが受取られ及び／又は後で実行するために格納装置３１０又はその他の非揮発性格納装置内に格納される場合にその受取ったコードを実行することが可能である。このように、コンピュータシステム３００は搬送波の形態でアプリケーションコードを得ることが可能である。
【００９１】
以上、本発明の具体的実施の態様について詳細に説明したが、本発明は、これら具体例にのみ制限されるべきものではなく、本発明の技術的範囲を逸脱することなしに種々の変形が可能であることは勿論である。
【図面の簡単な説明】
【００９２】
【図１】本発明の１実施例の動作の概観を例示したフローチャート。
【図２】本発明の１実施例に基づいてコンパイル時に囲んでいるクラスのアイデンティティ情報を発する技術の１例を例示したフローチャート。
【図３】本発明のある実施例を実装することが可能なコンピュータシステムの１例を示したブロック図。
【符号の説明】
【００９３】
３００  コンピュータシステム
３０２  バス
３０４  プロセッサ
３０６  メインメモリ
３０８  リードオンリメモリ（ＲＯＭ）
３１０  格納装置
３１２  ディスプレイ
３１４  入力装置
３１８  通信インターフェース
３２０  ネットワークリンク
３２２  ローカルネットワーク
３２４  ホストコンピュータ
３２６  インターネットサービスプロバイダー（ＩＳＰ）
３２８  インターネット
３３０  サーバー
【図１】
2007012066.tif 000017
【図２】
2007012066.tif 000018
【図３】
2007012066.tif 000019