(57)【特許請求の範囲】
【請求項１】
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部に、自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードすることを特徴とするクラスローダ。
【請求項２】
請求項１記載のクラスローダにおいて、
ロード要求されたクラスの完全修飾クラス名が自クラスローダの名前と関連付けて記録されていない場合には、親クラスローダに対して前記ロード要求されたクラスのロードを委譲することを特徴とするクラスローダ。
【請求項３】
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部と、
該外部定義記憶部に自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理をクラスローダに実行させるためのコードが記録された委譲モデル介入用コード記憶部と、
生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、前記委譲モデル介入用コード記憶部に記録されている前記コードを、前記クラスに組み込む委譲モデル介入手段とを備えたことを特徴とする情報処理装置。
【請求項４】
請求項３記載の情報処理装置において、
前記委譲モデル介入手段は、前記生成されたクラスがクラスローダクラスであるか否かを、前記クラスがクラスローダクラスを継承しているか否かに基づいて判定することを特徴とする情報処理装置。
【請求項５】
請求項３記載の情報処理装置において、
前記委譲モデル介入手段は、前記生成されたクラスがクラスローダクラスであるか否かを、前記クラスの完全修飾クラス名に予め定められている文字列が含まれているか否かに基づいて判定することを特徴とする情報処理装置。
【請求項６】
請求項３乃至５の何れか１項に記載の情報処理装置において、
ユーザの指示に従って、前記外部定義記憶部の内容を更新する外部定義更新手段を備えたことを特徴とする情報処理装置。
【請求項７】
請求項３乃至６の何れか１項に記載の情報処理装置において、
前記委譲モデル介入用コード記憶部には、ロード要求されたクラスの完全修飾クラス名が自クラスローダの名前と関連付けて記録されていない場合には、親クラスローダに対して前記ロード要求されたクラスのロードを委譲する処理を前記クラスローダに実行させるためのコードが記録されていることを特徴とする情報処理装置。
【請求項８】
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部を備えたコンピュータが実行するクラスロード方法であって、
前記コンピュータが、自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードすることを特徴とするクラスロード方法。
【請求項９】
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部と、該外部定義記憶部に自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理をクラスローダに実行させるためのコードが記録された委譲モデル介入用コード記憶部と、委譲モデル介入手段とを備えたコンピュータが実行する委譲モデル介入方法であって、
前記委譲モデル介入手段が、生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、前記委譲モデル介入用コード記憶部に記録されている前記コードを、前記クラスに組み込むことを特徴とする委譲モデル介入方法。
【請求項１０】
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部を備えたコンピュータに、
自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクト指向プログラミング言語で記述されたプログラムを実行する情報処理装置のクラスローダに関する。
【背景技術】
【０００２】
Java（登録商標）に代表されるオブジェクト指向プログラミング言語では、クラスローダにおけるクラスのロード処理に親子階層委譲モデルを採用している（例えば、特許文献１参照）。一般的な親子関係委譲モデルは、複数のクラスローダが階層化されており、クラスをロードすることが必要になったクラスローダは、自クラスローダでクラスをロードする前に、親クラスローダに対してクラスのロードを委譲（依頼）する。委譲先のクラスローダは、親クラスローダが存在する場合は、親クラスローダに対してクラスのロードを委譲し、親クラスローダが存在しない場合（自クラスローダが最上位階層のクラスローダの場合）は、クラスのロードを試みる。そして、クラスのロード処理に成功した場合は、ロード処理終了となる。これに対して、ロード処理に失敗した場合は、ロード処理に失敗したクラスローダの子クラスローダがロード処理を試みる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−２５０７６３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、近年、ソフトウェアの開発時に、Apache Foundation等のオープンソースコミュニティから配布されるオープンソースモジュールを利用するということが盛んに行われるようになってきており、Javaなどのオブジェクト指向プログラミング言語を用いてソフトウェアを開発する場合も、オープンソースモジュールが多く利用されている。オープンソースモジュールを利用することにより、ソフトウェアの開発工数、コスト等を削減できる。しかし、クラスのロード処理に親子階層委譲モデルを採用しているオブジェクト指向プログラミング言語（例えば、Java）のオープンソースモジュールを利用してミドルウェア製品を開発した場合、希望するバージョンのクラスをロードすることができない場合があるという課題がある。ここで、図９を参照して上記した課題について詳しく説明する。
【０００５】
図９を参照すると、委譲関係を有する３個のクラスローダＡ〜Ｃが示されている。クラスローダＣの親はクラスローダＢ、クラスローダＢの親はクラスローダＡとなっている。ここでは、クラスローダＡ，Ｂは基盤製品側のクラスローダ、クラスローダＣはユーザアプリケーション側のクラスローダであるとする。また、図９には、オープンソースモジュールＭ（単にモジュールＭと記す場合もある）と、モジュールＭをバージョンアップしたモジュールＭａとが示されている。モジュールＭには、クラスＸ，Ｘ１，…が含まれ、モジュールＭａには、クラスＸａ，Ｘ１ａ，…が含まれている。クラスＸａ，Ｘ１ａ，…は、クラスＸ，Ｘ１，…をバージョンアップしたクラスである。なお、クラスＸ，Ｘａの完全修飾クラス名は共に「PackageX.ClassX」、クラスＸａ，Ｘ１ａの完全修飾クラス名は共に「PackageX.ClassX1」である。
【０００６】
ここで、ユーザがユーザアプリケーションを作成するために、クラスＸをバージョンアップしたモジュールＭａ内のクラスＸａを利用したとする。
【０００７】
そして、ユーザアプリケーションを実行するために、ユーザアプリケーション側のクラスローダＣに対して、完全修飾クラス名「PackageX.ClassX」を含んだロード要求が入力されたとする（ステップＳ１）。クラスローダＣは、親クラスローダＢが存在するので、上記完全修飾クラス名のクラスのロードを親クラスローダＢに委譲する（ステップＳ２）。クラスローダＢも親クラスローダＡが存在するので、上記完全修飾クラス名のクラスのロードを親クラスローダＡに委譲する（ステップＳ３）。クラスローダＡには親が存在しないので、クラスローダＡは、上記完全修飾クラス名「PackageX.ClassX」を有するクラスＸをモジュールＭからロードする（ステップＳ４）。このように、一般的な親子階層委譲モデルでは、ロード要求されたクラスＸａとはバージョンが異なるクラスＸがロードされてしまい、ユーザに希望に応えることができない場合があるという課題があった。
【０００８】
[発明の目的]
そこで、本発明の目的は、一般的な親子階層委譲モデルでは、ロード要求されたクラスとはバージョンが異なるクラスがロードされてしまい、ユーザに希望に応えることができない場合があるという課題を解決したクラスローダを提供することにある。
【課題を解決するための手段】
【０００９】
本発明に係るクラスローダは、
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部に、自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする。
【００１０】
本発明に係る情報処理装置は、
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部と、
該外部定義記憶部に自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理をクラスローダに実行させるためのコードが記録された委譲モデル介入用コード記憶部と、
生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、前記委譲モデル介入用コード記憶部に記録されている前記コードを、前記クラスに組み込む委譲モデル介入手段とを備える。
【００１１】
本発明に係るクラスロード方法は、
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部を備えたコンピュータが実行するクラスロード方法であって、
前記コンピュータが、自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする。
【００１２】
本発明に係る委譲モデル介入方法は、
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部と、該外部定義記憶部に自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理をクラスローダに実行させるためのコードが記録された委譲モデル介入用コード記憶部と、委譲モデル介入手段とを備えたコンピュータが実行する委譲モデル介入方法であって、
前記委譲モデル介入手段が、生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、前記委譲モデル介入用コード記憶部に記録されている前記コードを、前記クラスに組み込む。
【００１３】
本発明にかかるプログラムは、
クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、前記ロード対象にするクラスのロード元とが記録された外部定義記憶部を備えたコンピュータに、
自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、前記ロード要求されたクラスを、前記完全修飾クラス名と関連付けて記録されているロード元からロードする処理を実行させる。
【発明の効果】
【００１４】
本発明によれば、希望するバージョンのクラスをロードすることが可能になるという効果を得ることができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施の形態に係る情報処理装置１の構成例を示すブロック図である。
【図２】クラスローダ部１１１の構成例を示すブロック図である。
【図３】外部定義記憶部２１の内容例を示す図である。
【図４】委譲モデル介入手段１２の処理例を示すフローチャートである。
【図５】委譲モデル介入用のバイトコードが行う処理例を示すフローチャートである。
【図６】本発明の第２の実施の形態で使用する外部定義記憶部２１ａの内容例を示す図である。
【図７】本発明の第３の実施の形態で使用する外部定義記憶部２１ｂの内容例を示す図である。
【図８】本発明の第２の実施の形態に係る情報処理装置７１の構成例を示すブロック図である。
【図９】本発明で解決する課題を説明するための図である。
【発明を実施するための形態】
【００１６】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
【００１７】
[本発明の第１の実施の形態]
図１を参照すると、本発明の第１の実施の形態に係る情報処理装置１は、プロセス１１と、委譲モデル介入手段１２と、外部定義更新手段１３と、ディスク装置などの記憶装置２と、キーボード等の入力部３と、ＬＣＤ等の表示部４とを備えている。
【００１８】
プロセス１１は、Java等のオブジェクト指向プログラミング言語で実装されたプログラムを実行するものであり、クラスローダ部１１１と、インジェクション用インターフェース１１２とを備えている。なお、オブジェクト指向プログラミング言語がJavaの場合、プロセス１１はJava仮想マシンに相当する。
【００１９】
図２を参照すると、クラスローダ部１１１は、４個のクラスローダ１１１Ａ〜１１１Ｄを備えている。委譲関係は、クラスローダ１１１Ｄの親がクラスローダ１１１Ｃ、クラスローダ１１１Ｃの親がクラスローダ１１１Ｂ、クラスローダ１１１Ｂの親がクラスローダ１１１Ａとなっている。なお、クラスローダ１１１Ａ，１１１Ｂは基盤製品側のクラスローダ、１１１Ｃ，１１１Ｄは、アプリケーション側のクラスローダであるとする。
【００２０】
記憶装置２は、外部定義記憶部２１と、委譲モデル介入用バイトコード記憶部２２とを備えている。
【００２１】
外部定義記憶部２１には、クラスローダ１１１Ａ〜１１１Ｄのクラスローダ名「ClassloaderＡ〜ClassloaderＤ」に関連付けて、そのクラスローダがロード対象にしているクラスの完全修飾クラス名と、そのクラスのロード元モジュールを示す情報とが記録されている。ここで、クラスローダ名に関連付けて、そのクラスローダがロード対象にしているクラスの完全修飾クラス名を全て記録するようにしても良いが、そのクラスローダがロード対象にしているクラスの内の、そのクラスローダよりも上位階層のクラスローダがロード対象にしているクラスと完全修飾クラス名が一致し且つバージョンが異なるクラスの完全修飾クラス名だけを記録するようにしても良い。また、ロード対象にするクラスをワイルドカードを用いて指定できるようにしても良い。
【００２２】
図３は、外部定義記憶部２１の内容例を示した図であり、第１番目〜第４番目のレコードは、それぞれクラスローダ１１１Ａ〜１１１Ｄに対応している。同図の第１番目のレコードは、クラスローダ名「ClassloaderＡ」のクラスローダ１１１Ａは、完全修飾クラス名「packageA.SampleClass」のクラスをロード対象にしていることだけを示しており、そのロード元がどこであるかは示していない。また、第３番目のレコードは、クラスローダ名「ClassloaderＣ」のクラスローダ１１１Ｃは、完全修飾クラス名「packageA.SampleClass」のクラスをロード対象にしており、そのロード元が「ModuleB」であることを示している。ここで、クラスローダ１１１Ａ，１１１Ｃは、共に完全修飾クラス名が「packageA.SampleClass」のクラスをロード対象にしているが、クラスローダ１１１Ａは旧バージョンのクラスをロード対象にしており、クラスローダ１１１Ｃは最新バージョンのクラスをロード対象にしているとする。
【００２３】
委譲モデル介入用バイトコード記憶部２２には、クラスローダを実現するクラスローダクラスの生成時に、生成したクラスローダクラスのロードメソッドに挿入（インジェクション）する委譲モデル介入用のバイトコードが記録されている。委譲モデル介入用のバイトコードは、クラスローダに下記の処理を行わせるものである。
【００２４】
・クラスのロード要求があった場合、外部定義記憶部２１を参照し、自クラスローダのクラスローダ名に関連付けて、ロード要求されているクラスの完全修飾クラス名が記録されているか否かを判定する処理。
・自クラスローダのクラスローダ名に関連付けて、ロード要求されているクラスの完全修飾クラス名が記録されている場合は、ロード要求されているクラスを、外部定義記憶部２１に記録されているロード元モジュールからロードする処理。
・自クラスローダのクラスローダ名に関連付けて、ロード要求されているクラスの完全修飾クラス名が記録されていない場合は、親クラスローダにクラスのロードを委譲する処理。
【００２５】
委譲モデル介入手段１２は、生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、外部定義記憶部２１に記録されている委譲モデル介入用のバイトコードを上記生成されたクラスのロードメソッドに挿入する機能を有する。
【００２６】
外部定義更新手段１３は、入力部３から入力されるユーザの指示に従って、外部定義記憶部２１の内容を更新する機能を有する。
【００２７】
なお、上記した委譲モデル介入手段１２および外部定義更新手段１３は、コンピュータによって実現可能であり、コンピュータによって実現する場合は、例えば次のようにする。コンピュータを委譲モデル介入手段１２および外部定義更新手段１３として機能させるためのプログラムを記録したディスク、半導体メモリ、その他の記録媒体を用意し、コンピュータに上記プログラムを読み取らせる。コンピュータは、読み取ったプログラムに従って自身の動作を制御することにより、自コンピュータ上に、委譲モデル介入手段１２および外部定義更新手段１３を実現する。
【００２８】
[第１の実施の形態の動作]
次に、本実施の形態の動作について詳細に説明する。
【００２９】
プロセス１１は、図２に示した４個のクラスローダ１１１Ａ〜１１１Ｄを上位階層のものから順に生成していく。プロセス１１は、最上位階層のクラスローダ１１１Ａを実現するクラスローダクラスを生成すると（クラスローダクラスのバイトコードを図示を省略したメモリ上に展開すると）、委譲モデル介入手段１２を呼び出し、上記クラスローダクラスの完全修飾クラス名を渡す。
【００３０】
これにより、委譲モデル介入手段１２は、図４のフローチャートに示すように、プロセス１１から渡された完全修飾クラス名が、最上位階層のクラスローダ１１１Ａに対応するクラスローダクラスの完全修飾クラス名であるか否かを判定する（ステップＳ４１）。この例の場合、ステップＳ４１の判定結果がＹｅｓとなるので、委譲モデル介入手段１２は、委譲モデル介入用バイトコード記憶部２２から委譲モデル介入用のバイトコードを入力し、入力したバイトコードをインジェクション用インターフェース１１２を介して上記クラスローダクラスのロードメソッドに挿入し（ステップＳ４３）、その後、処理を終了する。これ以降、上記クラスローダクラスでのロードメソッドの呼び出し時に、挿入した委譲モデル介入用のバイトコードが呼び出されるようになる。
【００３１】
一方、プロセス１１は、クラスローダ１１１Ａを生成すると、クラスローダ１１１Ｂを実現するためのクラスローダクラスを生成し、その後、委譲モデル介入手段１２を呼び出し、上記クラスローダクラスの完全修飾クラス名を渡す。
【００３２】
これにより、委譲モデル介入手段１２は、図４のフローチャートに示すように、プロセス１１から渡された完全修飾クラス名が、最上位階層のクラスローダ１１１Ａに対応するクラスローダクラスの完全修飾クラス名であるか否かを判定する（ステップＳ４１）。この例の場合、ステップＳ４１の判定結果はＮｏとなるので、委譲モデル介入手段１２は、今回生成されたクラス（クラスローダ１１１Ｂを実現するためのクラスローダクラス）の完全修飾クラス名をプロセス１１に渡し、今回生成されたクラスがクラスローダクラスを承継したクラスローダ承継クラスであるか否かを問い合わせる（ステップＳ４２）。ここで、クラスローダ継承クラスであるか否かを問い合わせるのは、今回生成されたクラスが、クラスローダを実現するクラスであるか否かを判定するためである。なお、クラスローダを実現するクラスローダクラスは、最上位階層のクラスローダ１１１Ａを実現するクラスローダクラスを除き、必ず、他のクラスローダクラスを継承するものとする。また、生成されたクラスがクラスローダクラスであるか否かを判定する判定方法は、上記した方法に限られるものではなく、次のような方法を採用することもできる。クラスローダを実現するクラスローダクラスのクラス名には、特定の文字列が含まれるようにしておき、生成されたクラスのクラス名に上記特定の文字列が含まれている場合には、クラスローダクラスと判定するという方法を採用してもよい。但し、クラスローダクラス以外のクラスのクラス名には、上記特定の文字列が含まれないようにすることが必要である。
【００３３】
一方、問い合わせを受けたプロセス１１は、例えば、オブジェクト指向プログラミング言語に標準で準備されているis-a判定メソッドを用いて、問い合わせのあったクラスがクラスローダクラスを継承しているクラスローダ継承クラスである否かを判定し、判定結果を委譲モデル介入手段１２に返す。
【００３４】
委譲モデル介入手段１２は、プロセス１１からクラスローダ承継クラスであるとの回答を得た場合（ステップＳ４２がＹｅｓ）は、今回生成されたクラスローダ１１１Ｂを実現するためのクラスローダクラスのロードメソッドに、委譲モデル介入用バイトコード記憶部２２から読み込んだバイトコードを挿入し（ステップＳ４３）、その後、その処理を終了する。これ以降、上記クラスローダクラスでのロードメソッドの呼び出し時、挿入した委譲モデル介入用のバイトコードが呼び出されるようになる。これに対し、プロセス１１からクラスローダ承継クラスではないとの回答を得た場合（ステップＳ４２がＮｏ）は、その処理を終了する。
【００３５】
その後、クラスローダ１１１Ｃ，１１１Ｄを実現するためのクラスローダクラスが生成される度に、前述した処理と同様の処理が行われ、生成されたクラスローダクラスのロードメソッドに、委譲モデル介入用のバイトコードが挿入される。
【００３６】
また、プロセス１１は、クラスローダクラス以外のクラスを生成した場合も、委譲モデル介入手段１２を呼び出し、生成したクラスの完全修飾クラス名を渡す。
【００３７】
クラスローダクラス以外のクラスの完全修飾クラス名が渡されると、ステップＳ４１，Ｓ４２の判定結果が共にＮｏとなるので、委譲モデル介入手段１２は、委譲モデル介入用のバイトコードの挿入処理を行うことなく、その処理を終了する。
【００３８】
次に、図５のフローチャートを参照して、クラスローダクラスのロードメソッドが呼び出された際の処理について説明する。
【００３９】
プロセス１１上でプログラムが実行されると、何れかのタイミングでクラスのロードが必要となり、クラスローダクラス（クラスローダ１１１Ａ〜１１１Ｄを実現するクラスローダクラスの内の何れか）のロードメソッドが呼び出される。ここで、クラスロードクラスのロードメソッドには、委譲モデル介入手段１２によって委譲モデル介入用のバイトコードが挿入されているため、ロードメソッドが呼び出されることにより、バイトコードに従った図５のフローチャートに示す処理が行われる。
【００４０】
バイトコードに従った処理（委譲モデル介入処理）では、先ず、ロード対象のクラスが自クラスローダで既にロード済みのクラスであるか否かを判定する（ステップＳ５１）。そして、既にロード済みのクラスである場合（ステップＳ５１がＹｅｓ）は、その処理を終了する。これに対して、ロード済みのクラスでない場合（ステップＳ５１がＮｏ）は、外部定義記憶部２１に自クラスローダのクラスローダ名が記録されているか否かを判定する（ステップＳ５２）。
【００４１】
そして、クラスローダ名が記録されていない場合（ステップＳ５２がＮｏ）は、親クラスローダが存在するか否かを判定する（ステップＳ５３）。親クラスローダが存在する場合（ステップＳ５３がＹｅｓ）は、一般的な親子階層委譲モデルと同様に、自身の親クラスローダに対して、クラスのロード処理を委譲する（ステップＳ５５）。これに対して、親クラスローダが存在しない場合（ステップＳ５３がＮｏ）は、自クラスローダでクラスのロードを試みる（ステップＳ５６）。
【００４２】
また、ステップＳ５２において、外部定義記憶部２１に自クラスローダのクラスローダ名が記録されていると判定した場合は、更に、自クラスローダのクラスローダ名に関連付けて、ロード対象にしているクラスの完全修飾クラスおよびロード元が記録されているか否かを判定する（ステップＳ５４）。そして、記録されていない場合（ステップＳ５４がＮｏ）は、前述したステップＳ５３の処理を行う。これに対して、記録されている場合（ステップＳ５４がＹｅｓ）は、ロード対象にしているクラスを、外部定義記憶部２１に記録されているロード元モジュールからロードする（ステップＳ５７）。
【００４３】
また、ステップＳ５５において、クラスのロード処理を委譲された親クラスローダは、前述したステップＳ５１の処理を行う。
【００４４】
今、外部定義記憶部２１の内容が図３に示すものである場合に、完全修飾クラス名「packageA.SampleClass」のクラス（但し、モジュール「ModuleC」に含まれている最新バージョンのクラス）をロードするために、クラスローダ１１１Ｄを実現するクラスローダクラスのロードメソッドが呼び出されたとする。なお、各クラスローダ１１１Ａ〜１１１Ｄは、完全修飾クラス名「packageA.SampleClass」のクラスをロードしていないとする。
【００４５】
クラスローダ１１１Ｄは、ロード対象のクラスをロードしていないので（ステップＳ５１がＮｏ）、外部定義記憶部２１に自クラスローダ１１１Ｄのクラスローダ名「ClassloaderD」が記録されているか否かを判定する（ステップＳ５２）。図３に示すように、外部定義記憶部２１の第４番目のレコードに、クラスローダ１１１Ｄのクラスローダ名「ClassloaderD」が記録されているので（ステップＳ５２がＹｅｓ）、クラスローダ１１１Ｄは、クラスローダ名「ClassloaderD」に関連付けて、ロード対象にするクラスの完全修飾クラス名「packageA.SampleClass」およびロード元が記録されているか否かを判定する（ステップＳ５４）。図３に示した例では、記録されていないので（ステップＳ５４がＮｏ）、クラスローダ１１１Ｄは、親クラスローダ１１１Ｃに対して、クラスのロード処理を委譲する（ステップＳ５５）。
【００４６】
ロード処理を委譲されたクラスローダ１１１Ｃは、ロード対象のクラスをロードしていないので（ステップＳ５１がＮｏ）、外部定義記憶部２１に自クラスローダ１１１Ｃのクラスローダ名「ClassloaderC」が記録されているか否かを判定する（ステップＳ５２）。図３に示すように、外部定義記憶部２１の第３番目のレコードに、クラスローダ１１１Ｃのクラスローダ名「ClassloaderC」が記録されているので（ステップＳ５２がＹｅｓ）、クラスローダ１１１Ｃは、クラスローダ名「ClassloaderC」に関連付けて、ロード対象にするクラスの完全修飾クラス名「packageA.SampleClass」およびロード元が記録されているか否かを判定する（ステップＳ５４）。図３の例では、クラスローダ名「ClassloaderC」に関連付けてロード対象にするクラスの完全修飾クラス名「packageA.SampleClass」およびロード元のモジュール「ModuleB」が記録されているので（ステップＳ５４がＹｅｓ）、クラスローダ１１１Ｃは、モジュール「ModuleB」から完全修飾クラス名「packageA.SampleClass」のクラス（最新バージョンのクラス）をロードする（ステップＳ５７）。
【００４７】
[第１の実施の形態の効果]
本実施の形態によれば、希望するバージョンのクラスをロードすることが可能になるという効果を得ることができる。その理由は、生成されたクラスがクラスローダを実現するためのクラスか否かを判定し、クラスローダを実現するためのクラスであった場合には、委譲モデル介入用コード記憶部７４に記録されている委譲モデル介入用のバイトコードを、上記生成されたクラスに挿入する委譲モデル介入手段を備えているからである。
【００４８】
更に、本実施の形態は、ユーザに指示に従って、外部定義記憶部２１の内容を更新する外部定義更新手段１３を備えているので、ユーザが外部定義記憶部２１の内容を容易に変更することが可能になるという効果を得ることができる。
【００４９】
[本発明の第２の実施の形態]
次に、本発明の第２の実施の形態について説明する。本実施の形態と前述した第１の実施の形態との相違点は、図３に示した外部定義記憶部２１の代わりに、図６に示した外部定義記憶部２１ａを備えている点である。外部定義記憶部２１ａは、図６に示すように、基盤製品側のクラスローダ１１１Ａのクラスローダ名「ClassloaderA」に関連付けて、ロード対象にするクラス（完全修飾クラス名「packageA.SampleClass」のクラス）のロード元モジュール「ModuleA」が記録されている点、および、アプリケーション側のクラスローダ１１１Ｃのクラスローダ名「ClassloaderC」に関連付けて、ロード対象にするクラス（完全修飾クラス名「packageA.SampleClass」のクラス）のロード元モジュールが記録されていない点で、図３に示した外部定義記憶部２１と相違している。なお、外部定義記憶部２１ａは、例えば、外部定義記憶部２１の内容を外部定義更新手段１３を用いて変更することにより作成することができる。
【００５０】
[第２の実施の形態の動作]
今、外部定義記憶部２１ａの内容が図６に示すものである場合に、完全修飾クラス名「packageA.SampleClass」のクラス（但し、モジュール「ModuleA」に含まれている旧バージョンのクラス）をロードするために、クラスローダ１１１Ｄを実現するクラスローダクラスのロードメソッドが呼び出されたとする。なお、各クラスローダ１１１Ａ〜１１１Ｄは、完全修飾クラス名「packageA.SampleClass」のクラスをロードしていないとする。
【００５１】
クラスローダ１１１Ｄは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ａに登録されており、ロード対象クラスのロード元モジュールが外部定義記憶部２１ａに記録されておらず、且つ、親クラスローダ１１１Ｃが存在するので（図５のステップＳ５１がＮｏ、Ｓ５２がＹｅｓ、Ｓ５４がＮｏ、Ｓ５３がＹｅｓ）、親クラスローダ１１１Ｃにクラスのロード処理を委譲する（ステップＳ５５）。
【００５２】
クラスのロード処理を委譲されたクラスローダ１１１Ｃは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ａに記録されているので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ）、クラスローダ名「ClassloaderC」に関連付けて、ロード要求されているクラスの完全修飾クラス名「packageA.SampleClass」およびロード元モジュールが記録されているか否かを判定する（ステップＳ５４）。この例の場合、ロード要求されているクラスの完全修飾クラス名「packageA.SampleClass」は記録されているが、ロード元のモジュールが記録されていないので、クラスローダ１１１Ｃは、親クラスローダ１１１Ｂにクラスのロード処理を委譲する（ステップＳ５３がＹｅｓ、ステップＳ５５）。
【００５３】
クラスのロード処理を委譲されたクラスローダ１１１Ｂは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ａに登録されており、ロード対象クラスのロード元モジュールが外部定義記憶部２１ａに記録されておらず、親クラスローダ１１１Ｃが存在するので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ、Ｓ５４がＮｏ、Ｓ５３がＹｅｓ）、親クラスローダ１１１Ａにクラスのロード処理を委譲する（ステップＳ５５）。
【００５４】
親クラスローダ１１１Ａは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ａに登録されており、且つ、クラスローダ名「ClassloaderA」に関連付けて、ロード要求されているクラスの完全修飾クラス名「packageA.SampleClass」およびロード元モジュール「ModuleA」が記録されているので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ、Ｓ５４がＹｅｓ）、モジュール「ModuleA」から完全修飾クラス名「packageA.SampleClass」のクラス（旧バージョンのクラス）をロードする（ステップＳ５７）。
【００５５】
[第２の実施の形態の効果]
本実施の形態によれば、第１の実施の形態と同様の効果を得ることができる。
【００５６】
[本発明の第３の実施の形態]
次に、本発明の第３の実施の形態について説明する。本実施の形態と前述した第１の実施の形態との相違点は、図３に示した外部定義記憶部２１の代わりに図７に示した外部定義記憶部２１ｂを備えている点である。外部定義記憶部２１ｂは、クラスローダ名「ClassloaderA」に関連付けて、完全修飾クラス名「packageA.SampleClass」のクラスのロード元のモジュール「ModuleA」が記録されている点で、図３に示した外部定義記憶部２１と相違している。
【００５７】
[第３の実施の形態の動作の説明]
次に、本実施の形態の動作について説明する。今、外部定義記憶部２１ｂの内容が図７に示すものである場合に、完全修飾クラス名「packageA.SampleClass」のクラス（但し、モジュール「ModuleB」に含まれている最新バージョンのクラス）をロードするために、クラスローダ１１１Ｄを実現するクラスローダクラスのロードメソッドが呼び出されたとする。なお、各クラスローダ１１１Ａ〜１１１Ｄは、完全修飾クラス名「packageA.SampleClass」のクラスをロードしていないとする。
【００５８】
クラスローダ１１１Ｄは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ｂに登録されており、ロード対象クラスのロード元モジュールが外部定義記憶部２１ｂに記録されておらず、且つ、親クラスローダ１１１Ｃが存在するので（図５のステップＳ５１がＮｏ、Ｓ５２がＹｅｓ、Ｓ５４がＮｏ、Ｓ５３がＹｅｓ）、親クラスローダ１１１Ｃにクラスのロード処理を委譲する（ステップＳ５５）。
【００５９】
親クラスローダ１１１Ｃは、ロード要求されたクラスをロード済みでなく、クラスローダ名が外部定義記憶部２１ｂに記録されているので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ）、クラスローダ名「ClassloaderD」に関連付けて、ロード要求されているクラスの完全修飾クラス名「packageA.SampleClass」、及び、ロード元のモジュールが記録されているか否かを判定する（ステップＳ５４）。この例の場合、完全修飾クラス名およびロード元のモジュールが記録されているので（ステップＳ５４がＹｅｓ）、クラスローダ１１１Ｃは、モジュール「ModuleB」からロード要求されている完全修飾クラス名「packageA.SampleClass」のクラス（最新バージョンのクラス）をロードする（ステップＳ５７）。
【００６０】
また、例えば、外部定義記憶部２１ｂの内容が図７に示すものである場合に、完全修飾クラス名「packageA.SampleClass」のクラス（但し、モジュール「ModuleA」に含まれている旧バージョンのクラス）をロードするために、クラスローダ１１１Ｂを実現するクラスローダクラスのロードメソッドが呼び出された場合には、次のような処理が行われる。
【００６１】
クラスローダ１１１Ｂは、ロード要求されているクラスをロードしておらず、クラスローダ名が外部定義記憶部２１ｂに記録されており、ロード要求されているクラスの完全修飾クラス名およびロード元のモジュールが記録されておらず、且つ、親クラスローダ１１１Ａが存在するので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ、Ｓ５４がＮｏ、Ｓ５３がＹｅｓ）、親クラスローダ１１１Ａにクラスのロード処理を委譲する（ステップＳ５５）。
【００６２】
親クラスローダ１１１Ａは、ロード要求されているクラスをロードしておらず、クラスローダ名が外部定義記憶部２１ｂに記録されているので（ステップＳ５１がＮｏ、Ｓ５２がＹｅｓ）、クラスローダ名「ClassloaderA」に関連付けて、ロード要求されているクラスの完全修飾クラス名「packageA.SampleClass」、及び、ロード元のモジュールが記録されているか否かを判定する（ステップＳ５４）。この例の場合、完全修飾クラス名およびロード元のモジュールが記録されているので（ステップＳ５４がＹｅｓ）、クラスローダ１１１Ａは、モジュール「ModuleA」からロード要求されている完全修飾クラス名「packageA.SampleClass」のクラス（旧バージョンのクラス）をロードする（ステップＳ５７）。
【００６３】
なお、本実施の形態では、既にロードされているクラスと完全修飾クラス名が同一のクラスがロードされる場合がある。このような場合は、クラス競合を防ぐため、例えば、ロード順が後のクラスの完全修飾クラス名を変更する等の処置をとる必要がある。
【００６４】
[第３の実施の形態の効果]
本実施の形態によれば、第１の実施の形態と同様の効果を得ることができる。
【００６５】
[本発明の第４の実施の形態]
次に、本発明の第４の実施の形態について説明する。
【００６６】
図８を参照すると、本発明の第４の実施の形態にかかる情報処理装置７１は、委譲モデル介入手段７２と、外部定義記憶部７３と、委譲モデル介入用コード記憶部７４とを備えている。
【００６７】
外部定義記憶部７３には、クラスローダの名前に関連付けて、そのクラスローダがロード対象にするクラスの完全修飾クラス名と、上記ロード対象にするクラスのロード元とが記録されている。
【００６８】
委譲モデル介入用コード記憶部７４には、外部定義記憶部７３に自クラスローダの名前と関連付けてロード要求されたクラスの完全修飾クラス名が記録されているか否かを判定し、記録されている場合は、上記ロード要求されたクラスを、上記完全修飾クラス名と関連付けて記録されているロード元からロードする処理をクラスローダに実行させるためのコードが記録されている。
【００６９】
委譲モデル介入手段７２は、生成されたクラスがクラスローダを実現するクラスローダクラスか否かを判定し、クラスローダクラスである場合は、委譲モデル介入用コード記憶部７４に記録されている上記コードを、上記クラスに組み込む。
【００７０】
[第４の実施の形態の効果]
本実施の形態によれば、希望するバージョンのクラスをロードすることができるという効果を得ることができる。その理由は、生成されたクラスがクラスローダを実現するためのクラスか否かを判定し、クラスローダを実現するためのクラスであった場合には、委譲モデル介入用コード記憶部に記録されているコードを、上記生成されたクラスに挿入する委譲モデル介入手段を備えているからである。
【符号の説明】
【００７１】
１      情報処理装置
２      記憶装置
３      入力部
４      表示部
１１    プロセス
１２    委譲モデル介入手段
１３    外部定義更新手段
２１、２１ａ、２１ｂ    外部定義記憶部
２２    委譲モデル介入用バイトコード記憶部
１１１  クラスローダ部
１１１Ａ〜１１１Ｅ  クラスローダ
１１２  インジェクション用インターフェース
７１    情報処理装置
７２    委譲モデル介入手段
７３    外部定義記憶部
７４    委譲モデル介入用コード記憶部
【図１】
0005880186.tif 000002
【図２】
0005880186.tif 000003
【図３】
0005880186.tif 000004
【図４】
0005880186.tif 000005
【図５】
0005880186.tif 000006
【図６】
0005880186.tif 000007
【図７】
0005880186.tif 000008
【図８】
0005880186.tif 000009
【図９】
0005880186.tif 000010