(57)【要約】【課題】未知の型のオブジェクトに高速にアクセスする方法を提供すること。【解決手段】実行のオーバーヘッドの増大を回避し得る、未知の型のオブジェクトを取り扱える方法を、特にアプリケーション・プログラミング・インタフェースとして提供する。本発明に係るプログラミング・インタフェースは、アクセスするフィールドの型がプリミティブ型の場合にもその値を直接利用し得る機能、呼び出すメソッドの返り値やパラメータの型がプリミティブ型の場合にもプリミティブ型の値を直接利用し得る機能、アクセス対象のオブジェクトのクラスに特化したランタイム用のコードを生成し得る機能、とを備え、生成コードにおいては、ｇｅｔｔｅｒ／ｓｅｔｔｅｒメソッド等の指定されたメソッドが直接呼び出される。【選択図】図３
2010123060.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーション・プログラムから未知であったクラスを利用するためにメモリ・デバイス中に特定のインタフェースを通じて利用できるライブラリを実行時に作成する方法であって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
アクセスされるオブジェクトを引数とするメソッドを用意するステップと、
前記オブジェクトを読み出す場合には前記オブジェクトのプロパティの型を戻り値の型とするステップと、
前記オブジェクトに書き込む場合には前記プロパティの型を前記引数に追加するステップと、
を含む、インタフェースのライブラリを作成する方法。
【請求項２】
前記メソッドを用意するステップは、更に前記プロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記メソッドを用意する、請求項１に記載のインタフェースのライブラリを作成する方法。
【請求項３】
前記オブジェクトのプロパティの型を戻り値の型とするステップは、更に前記プロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記戻り値の型を用意する、請求項１に記載のインタフェースのライブラリを作成する方法。
【請求項４】
前記プロパティの型を前記引数に追加するステップは、更に前記プロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記引数を用意する、請求項１に記載のインタフェースのライブラリを作成する方法。
【請求項５】
更に、２つの前記オブジェクトの一方から他方へ前記プロパティをコピーするためのメソッドを用意するステップを含む、請求項１に記載のインタフェースのライブラリを作成する方法。
【請求項６】
更に、前記プロパティをコピーするためのメソッドは、２つの前記オブジェクトを引数として、２つの前記オブジェクトの前記プロパティをコピーする動作、又は２つの前記オブジェクトの前記プロパティをコピーすると共に２つの前記オブジェクトが参照するインスタンスをコピーする動作を実施する、請求項５に記載のインタフェースのライブラリを作成する方法。
【請求項７】
アプリケーション・プログラムから未知であったクラスを利用するためにメモリ・デバイス中にライブラリを実行時に作成する方法であって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
アクセスされるオブジェクトを引数とするメソッドを用意するステップと、
前記アクセスされるオブジェクトが有するメソッド情報と、既知のインタフェースのメソッド情報とに基づいて、前記アクセスされるオブジェクトが有するメソッドを、前記既知のインタフェースを通じて行えるようにするインヴォーカ・オブジェクトを返すステップと、を含み、
前記インヴォーカ・オブジェクトによるメソッド呼び出しメソッドは、前記アクセスされるオブジェクトを引数とする、
ライブラリを作成する方法。
【請求項８】
前記アプリケーション・プログラムが前記オブジェクトにアクセスすることに応答して、
前記アクセスされるオブジェクトを引数とするメソッドを用意するステップは、前記メソッドに基づくコードを生成する、
請求項１に記載のインタフェースのライブラリを作成する方法。
【請求項９】
前記メソッドに基づく前記コードは、予め用意したテンプレートに基づくバイトコードである、
請求項８に記載のインタフェースのライブラリを作成する方法。
【請求項１０】
前記アプリケーション・プログラムが前記オブジェクトにアクセスすることに応答して、
前記アクセスされるオブジェクトを引数とするメソッドを用意するステップは、前記メソッドに基づくコードを生成する、
請求項７に記載のライブラリを作成する方法。
【請求項１１】
前記メソッドに基づく前記コードは、予め用意したテンプレートに基づくバイトコードである、請求項１０に記載のライブラリを作成する方法。
【請求項１２】
アプリケーション・プログラムから未知であったクラスを利用するためにメモリ・デバイス中に特定のインタフェースを通じて利用できるライブラリを実行時に作成する方法であって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
アクセスされるオブジェクトを引数とするメソッドを用意するステップであって、前記オブジェクトのプロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記メソッドを用意するステップと、
前記オブジェクトを読み出す場合には前記オブジェクトのプロパティの型を戻り値の型とするステップであって、前記プロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記戻り値の型を用意するステップと、
前記オブジェクトに書き込む場合には前記プロパティの型を前記引数に追加するステップであって、前記プロパティの型の差異に基づいて異なる前記プロパティの型の数だけ独立して前記引数を用意するステップと、
２つの前記オブジェクトの一方から他方へ前記プロパティをコピーするためのメソッドを用意するステップとを含む、
インタフェースのライブラリを作成する方法。
【請求項１３】
請求項１から１２のいずれか１項に記載の方法の各ステップをコンピュータに実行させるためのコンピュータ・プログラム。
【請求項１４】
アプリケーション・プログラムから未知であったクラスを利用するためにメモリ・デバイス中に特定のインタフェースのライブラリを実行時に作成するシステムであって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
アクセスされるオブジェクトを引数とするメソッドを用意する手段と、
前記オブジェクトを読み出す場合には前記オブジェクトのプロパティの型を戻り値の型とする手段と、
前記オブジェクトに書き込む場合には前記プロパティの型を前記引数に追加する手段と、
を含む、
インタフェースのライブラリを作成するシステム。
【請求項１５】
アプリケーション・プログラムから未知であったクラスを利用するためにコンピュータ可読媒体中にライブラリを実行時に作成するシステムであって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
アクセスされるオブジェクトを引数とするメソッドを用意する手段と、
前記アクセスされるオブジェクトが有するメソッド情報と、既知のインタフェースのメソッド情報とに基づいて、前記アクセスされるオブジェクトが有するメソッドを、前記既知のインタフェースを通じて行えるようにするインヴォーカ・オブジェクトを返す手段と、を含み、
前記インヴォーカ・オブジェクトによるメソッド呼び出しメソッドは、前記アクセスされるオブジェクトを引数とする、
ライブラリを作成するシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、未知のオブジェクトにアクセスする方法に関し、特にアプリケーション・プログラミング・インタフェースとして提供し得る、未知の型のオブジェクトに高速にアクセスする方法に関する。
【背景技術】
【０００２】
従来、種々の型のデータ又は種々のデータセットの様式を含む様々な形態のデータへの柔軟なアクセスを容易にするために、例えば、Ｊａｖａ（登録商標）２  Ｓｔａｎｄａｒｄ  Ｅｄｉｔｉｏｎ（Ｊａｖａ  ＳＥ）技術スイートの構成要素であり、再利用可能なソフトウェア・コンポーネントであるＪａｖａＢｅａｎ仕様に見られる、ソフトウェア・コンポーネントへのアクセス方法をカプセル化する技術が知られている（非特許文献１）。この技法によれば、データの所与の組にアクセスするためにアプリケーション・プログラム・インターフェース（ＡＰＩ）の組が公開され、データの新しい組にアクセスする時には必ず規定の形式を用いて、ソフトウェアを記述することを必要とする。このため、リレーショナル・データベース・システム等によりデータの新しい組へのアクセスが必要となる場合等、特に、アクセス方法をカプセル化（クラス内部の属性を外部から隠し、必ずメソッドを通してアクセスさせる方法を指す）する技術及び他の類似する手法を用いる場合に、オーバーヘッドを生じ、維持にコストを要していた。
【非特許文献１】"Trail: JavaBeans（商標） (The Java（商標） Tutorials)."  [online].  Sun  Microsystems,  2008-03-19.  [retrieved  on  2008-11-18].  Retrieved  from  the  Internet:  <URL:http://java.sun.com/docs/books/tutorial/javabeans/>
【発明の開示】
【発明が解決しようとする課題】
【０００３】
従来技術に係る未知の型のオブジェクトを取り扱える仕組みであるＪａｖａ（登録商標）におけるＪａｖａＢｅａｎｓ又はこの関連技術の利用においては、リフレクションと呼ばれる機構が使われ、これは実行オーバーヘッドが大きいことが知られている。リフレクションは、ＡＰＩとして汎用的な型で引数や返り値の型が固定されているため、例えば引数や返り値の型がプリミティブである場合にラップ／アンラップのステップが必要であり、オーバーヘッドを回避できない。類似の方法であるＡｐａｃｈｅのＢｅａｎＵｔｉｌｓも、リフレクションＡＰＩのメソッドクラスによりオブジェクトへのアクセサを表現しているため、同様にオーバーヘッドを生じる。一般的には、特定のＡＰＩの機能を置き換え可能なコードを生成して高速化する手法も想定し得るが、オブジェクトの態様が不明である場合には、コード生成を具体的に設計するための仕様の確定が困難である。更に、様々な型のオブジェクトにアクセスするために汎用性を確保すると、オブジェクトへのアクセスの高速化が犠牲になる場合がある。
【０００４】
本発明は、実行のオーバーヘッドの増大を回避し得る、未知の型のオブジェクトを取り扱える方法を提供することを目的とし、特にアプリケーション・インタフェースとしてこのような方法を提供することを目的とする。更に本発明は、本発明に係る方法をプログラミング環境又は実行時のランタイムにおいて利用可能なライブラリとして提供することを目的とする。
【課題を解決するための手段】
【０００５】
本発明は上記課題に鑑み、以下のような解決手段を提供する。なお、本願明細書の用語「アクセサ」は、オブジェクトの属性やプロパティを取得するメソッド（ｇｅｔｔｅｒ）と設定するメソッド（ｓｅｔｔｅｒ）との対を指す。
【０００６】
本発明は、オブジェクトの属性を読み書きするメソッドであるｇｅｔｔｅｒ／ｓｅｔｔｅｒメソッドによるアクセス、又は、ユーザにより指定される任意のシグネチャのメソッド呼び出しにおいて、未知のオブジェクトに対して汎用的なアクセスを許容するプログラミング・インタフェースを提供する。
【０００７】
一態様において、本発明は、未知の型のオブジェクトへの汎用的なアクセス手段を備えたライブラリにおいて、従来技術に係るリフレクションＡＰＩを用いず、プロパティのアクセスに特化したインタフェースを提供する。当該インタフェースは次の特徴を有する。
（特徴−１）プロパティ読み出しメソッド及び、プロパティ書き込みメソッドは、読み書き対象のオブジェクトを引数とする。
（特徴−２）読み出しメソッドは、プロパティの型を戻り値の型とする。
（特徴−３）書き込みメソッドは、対象オブジェクトの引数に加えて、プロパティの型の引数をとり得る。
（特徴−４）様々なプロパティの型に対応できるように、プリミティブ型及び参照型のそれぞれに特化したプロパティ読み書き用メソッドを提供する。すなわち、これらの特徴により、プロパティの型の差異に基づいて、異なるプロパティの型の数だけ独立してメソッドが用意され、異なるプロパティの型の数だけ独立して戻り値の型が用意され、異なるプロパティの型の数だけ独立して引数が用意され得る。更に、当該インタフェースは次の特徴を有する。
（特徴−５）２つのオブジェクトの一方から他方へプロパティをコピーするためのメソッドを提供する。当該メソッドは２つの対象オブジェクトを引数とする。
（特徴−６）変形として、コピー時に浅いコピーや深いコピー等の制御を行ない得るフィルタ・
オブジェクトを引数とすることも可能である。
【０００８】
別の態様において、本発明は、ユーザから与えられた２つのメソッド情報に基づいて、メソッド呼び出し実行において、従来技術に係るリフレクションＡＰＩを用いずに、未知のオブジェクトのメソッドを呼び出し得るライブラリを提供する。当該ライブラリは次の特徴を有する。
（特徴−７）アクセス対象オブジェクトのメソッド情報、及び既知のインタフェースのメソッド情報を与えられると、アクセス対象オブジェクト上の指定されたメソッド呼び出しを、既知のインタフェースを通じて行えるようにするインヴォーカ（ｉｎｖｏｋｅｒ）・オブジェクトを返す。
（特徴−８）インヴォーカ・オブジェクトのメソッド呼び出しメソッドは、通常の引数に加えて、呼び出し対象のオブジェクトを引数とする。
【０００９】
また別の態様において、本発明は、上記のインタフェース及びライブラリの実装において、実行時にコード生成を行なうことにより、従来技術に係るリフレクション機構を用いずに、特化されたコードによる高速なオブジェクトへのアクセスを可能にする機構を提供する。
【００１０】
更に別の態様において、本発明は、実行時のコード生成において、コードテンプレートの構成方法及びこれを用いるバイトコード生成方法を提供する。
【００１１】
このようにして、本発明に係るプログラミング・インタフェースは、次の機能を備えることが可能になる。
（機能−１）本発明に係るプログラミング・インタフェースは、アクセスするフィールドの型がプリミティブ型の場合にも、プリミティブ型の値を直接利用し得る。
（機能−２）本発明に係るプログラミング・インタフェースは、呼び出すメソッドの返り値やパラメータの型がプリミティブ型の場合にも、プリミティブ型の値を直接利用し得る。
（機能−３）本発明に係るプログラミング・インタフェースは、アクセス対象のオブジェクトのクラスに特化したランタイム用のコードを生成し得る。この生成コードにおいては、ｇｅｔｔｅｒ／ｓｅｔｔｅｒメソッドや、指定されたメソッドが直接呼び出される。
【００１２】
本発明に係るプログラミング・インタフェースにおいては、従来技術に係るリフレクションに替えてこれらの機能を用いることにより、未知の型を持つオブジェクトへの、高速なアクセスが可能になる。
【００１３】
本発明は、スクリプト言語を用いるプログラム開発言語、ハイパーテキスト等を解釈して実行するブラウザ及びこれを利用するプログラム開発環境、バイトコードを解釈して実行するインタプリタ及びその環境、コンパイラ、又はリレーショナル・データベース技術等の、既存の技術と組み合わせることができ、そのように組み合わせた技術もまた、本発明の技術範囲に含まれる。同様に、本発明の技法を含むアプリケーション開発環境又はデータベース・システム等も、本発明の技術範囲に含まれる。更に、本発明の技法は、オブジェクトにアクセスするための諸段階を、ＦＰＧＡ（現場でプログラム可能なゲートアレイ）、ＡＳＩＣ（特定用途向け集積回路）、これらと同等のハードウェアロジック素子、プログラム可能な集積回路、又はこれらの組み合わせが記憶し得るプログラムの形態、すなわちプログラム製品として提供し得る。具体的には、データ入出力、データバス、メモリバス、システムバス等を備えるカスタムＬＳＩ（大規模集積回路）の形態として、本発明に係るオブジェクトにアクセスするための手段を提供でき、そのように集積回路に記憶されたプログラム製品の形態も、本発明の技術範囲に含まれる。
【発明の効果】
【００１４】
本発明によれば、プリミティブ型の値を直接利用し得るインタフェースを用意することにより、従来技術に係るリフレクションにおいて問題であった、未知の型のオブジェクトにアクセスする場合に発生し得るオーバーヘッドの増大を回避し得る。また、本発明によれば、未知の型のオブジェクトにアクセスする方法をアプリケーション・インタフェースとして提供することにより、他のアプリケーションから本発明の方法を利用することが可能になる。更に本発明によれば、本発明に係る方法をプログラミング環境又は実行時のランタイムにおいて利用可能なライブラリとして提供することにより、バイトコードを実行させるプログラミング環境又はスクリプト言語等から本発明の方法を利用することが可能になる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施形態について式及び図を参照しながら説明する。なお、これらはあくまでも一例であって、本発明の技術的範囲はこれらに限られるものではない。
【００１６】
図１は、本発明の一実施形態に係る、アクセサ１２０の概略を表す説明図である。ユーザ１０５は、任意に所望するオブジェクトを操作するためにプログラミング・インタフェース１１０を用い得る。好適なプログラミング・インタフェース１１０は、例えばＪａｖａ（登録商標）のアプリケーション・プログラミング・インタフェースであり得るが、これに限定せず、任意のオブジェクト指向言語のアプリケーション・プログラミング・インタフェースを想定する。プログラミング・インタフェース１１０は、プログラムの単位であるクラス１３０にアクセスするために、アクセサ１２０を用い得る。典型的には、アクセサ１２０の役割は、プログラミング・インタフェース１１０により指定された特定のクラス１３０を利用するために、当該クラス１３０のメソッドが取り扱うことのできる形式の引数を用意すること、及び当該クラス１３０のメソッド呼び出しの結果を戻り値としてプログラミング・インタフェース１１０に返すことである。すなわち、アクセサ１２０は、プログラミング・インタフェース１１０とクラス１３０との間においてアプリケーション・プログラム・インタフェース（ＡＰＩと略称、Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）を実装するライブラリとして動作することができる。
【００１７】
一実施形態において、本発明に係るアクセサ１２０は、プログラミング・インタフェース１１０及びクラス１３０と協動し、次のように動作し得る。ここで、プログラミング・インタフェース１１０、アクセサ１２０及びクラス１３０は同一のコンピュータ装置等に実装されてもよく、ネットワークを介するサーバ装置等に分散して配置されてもよい。
Ｓ１１０：ユーザ１０５は、プログラミング・インタフェース１１０に対してオブジェクト操作等の要求を送信する。
Ｓ１２０：プログラミング・インタフェース１１０は、当該要求のうち、操作されるオブジェクトの属性及び／又はプロパティを取得及び／又は設定するために、アクセサ１２０を呼び出す。
Ｓ１３０：アクセサ１２０は、操作されるオブジェクトの属性及び／又はプロパティを取得及び／又は設定し、オブジェクトに対する操作を実行するクラス１３０のメソッドにこれらの値を引き渡し、実行制御をクラス１３０のメソッドに移行する。
Ｓ１４０：クラス１３０のメソッドは、オブジェクトに対する操作の結果をアクセサ１２０に返す。
Ｓ１５０：アクセサ１２０は、当該操作の結果をプログラミング・インタフェース１１０に返す。
Ｓ１６０：プログラミング・インタフェース１１０は、当該操作の結果をユーザ１０５に送信する。
【００１８】
このように、アクセサ１２０がオブジェクトの属性及び／又はプロパティを取得及び／又は設定することにより、ユーザ１０５は、様々な形態の属性及び／又はプロパティを有するオブジェクトを、共通したプログラミング・インタフェース１１０から利用し得る。同時に、ユーザ１０５は、共通したクラス１３０のメソッドを用いて同じクラスの様々なオブジェクトに対する操作を実施し得る。従って、図１に示すようなアクセサ１２０を通じてクラス１３０を利用するプログラミング・インタフェース１１０を用いることにより、ユーザ１０５は、属性及び／又はプロパティの形態が異なる様々なオブジェクトの操作において、オブジェクトごとに個別にコーディングする手間を省き、少ない手間で効率的にオブジェクト指向プログラムを開発することが可能になる。また、クラス１３０のメソッド呼び出しは、プログラミング・インタフェース１１０による設定に従って、任意の回数だけ実行され得るので、アクセサ１２０の動作を高速化することにより、ユーザ１０５から見た性能は向上し得る。
【００１９】
更に、本発明に係るアクセサを用いるプログラミング・インタフェースを説明するために、従来技術に係る方法の特徴を述べ、その後に従来技術と比較して本発明の方法を記載する。
【００２０】
従来技術に係る未知の型のオブジェクトを取り扱える仕組み、例えば、Ｊａｖａ（登録商標）におけるＢｅａｎ機構等は、柔軟なソフトウェア開発環境を構成するために不可欠の仕組みである。具体的には、オブジェクトのシリアライズ／デシリアライズ（バイト列等への変換／この逆の復元）を行なうような機構では、未知のクラスのインスタンス・オブジェクトを生成し、未知のクラスのオブジェクトのメソッドの呼び出しやフィールドの値の取り出しと設定とを行なう必要がある。しかしながら、このような機構を実現するためには、従来技術においてはリフレクションと呼ばれる機構が使われ、その実行オーバーヘッドが大きいことが知られてきた。
【００２１】
従来技術に係るリフレクション機構は、Ｊａｖａ（登録商標）  Ｒｅｆｌｅｃｔｉｏｎ  ＡＰＩ等の標準実装された特定のプログラミング・インタフェースを通じて動作するものであり、次のような特徴を有する。リフレクションは記述力が高く、比較的柔軟かつ汎用的なプログラムを作ることができる一方で、その実行速度が非常に遅いことが知られている。
（リフレクション−１）クラスに関するメタ情報をデータとして扱い得る。
（リフレクション−２）クラスやオブジェクトに対する汎用的操作を行い得る。
【００２２】
Ｊａｖａ（登録商標）におけるＢｅａｎ機構においては、ＢｅａｎＩｎｆｏと呼ばれるＡＰＩを通じてオブジェクトへの汎用的なアクセス手段が提供されている。一例において、ビーンのプロパティ（ゲッター／セッターメソッド呼び出し又はフィールドに直接読み書きすることでアクセス可能な仮想的なプロパティ）を全て合計してコンソールに表示するようなコードは、全プロパティがｉｎｔ型であることが既知であるならば、次式のように表される。
【数１】
2010123060.tif 000003
【００２３】
従来技術に係る上述の式［Ｉ］において、
０１行目は「変数ｏｂｊとして何らかのオブジェクトを受け取る」動作であり、
０２行目は「ｏｂｊからクラスを変数ｂｅａｎＣｌａｓｓとして得る」動作であり、
０３行目は「ｂｅａｎＣｌａｓｓからＢｅａｎＩｎｆｏオブジェクトを変数ｂｅａｎＩｎｆｏとして得る」動作であり、
０４行目は、「ｂｅａｎＩｎｆｏからＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒオブジェクトの配列を変数ｐｒｏｐｓとして得る」動作であり、
０５行目は「ｉｎｔ型の変数ｓｕｍを０で初期化する」動作であり、
０６行目は「ｐｒｏｐｓの各要素について」ループする動作であり、
０７〜０８行目は「ｇｅｔｔｅｒメソッドのＭｅｔｈｏｄオブジェクトを取り出し、そのｉｎｖｏｋｅメソッドを通して、ｏｂｊの各属性のｇｅｔｔｅｒメソッドを呼び出す」動作であり、
０９行目は「得られた結果をｉｎｔＶａｌｕｅ（）によりプリミティブ型のｉｎｔに変換して、ｓｕｍに足しこむ」動作であり、
１１行目は「ｓｕｍの値を表示する」動作であり得る。式［Ｉ］に示すアクセスの例は、０７行目において、Ｒｅｆｌｅｃｔｉｏｎ  ＡＰＩの一部であるＭｅｔｈｏｄクラス（メソッドの情報や汎用アクセスを提供するクラス）のインスタンスを用いることにより、プロパティにアクセスしている。
【００２４】
Ｒｅｆｌｅｃｉｔｏｎ  ＡＰＩを用いた汎用的なコードの動作が遅い理由は、主に２つ挙げられる。第１の理由は、実装において汎用的に作らなければならないという都合であり得る。第２の理由は、パラメータ値や返り値等、プリミティブ型の値をＯｂｊｅｃｔ型で扱えるようにラップ／アンラップする手間を要することであり得る。上の例では、Ｍｅｔｈｏｄクラスのｉｎｖｏｋｅ（）メソッドの動作が遅いということが第１の理由に相当する。また、ｉｎｖｏｋｅ（）を呼び出すために、オブジェクト型の配列で引数を構成し、オブジェクト型で返り値を受けていることが第２の理由に相当する。
【００２５】
上記式［Ｉ］により表されるプログラムは典型的なＢｅａｎＩｎｆｏの利用形態であるが、後に示す本発明と対比しやすくするため、上記のプログラムにおいてＭｅｔｈｏｄオブジェクトの取得を早い段階で行うように工夫した変形例を、次式に示す。
【数２】
2010123060.tif 000004
【００２６】
従来技術に係る上述の式［ＩＩ］において、
０１行目は、「変数ｏｂｊとして何らかのオブジェクトを受け取る」動作であり、
０２行目は、「ｏｂｊからクラスを変数ｂｅａｎＣｌａｓｓとして得る」動作であり、
０３行目は、「ｂｅａｎＣｌａｓｓからＢｅａｎＩｎｆｏオブジェクトを変数ｂｅａｎＩｎｆｏとして得る」動作であり、
０４行目は、「ｂｅａｎＩｎｆｏからＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒオブジェクトの配列を変数ｐｒｏｐｓとして得る」動作であり、
０５行目は、「ｐｒｏｐｓと同じ大きさの配列をａｃｃｅｓｓｏｒｓとして作る」動作であり、
０６〜０７行目は、「各ＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒ要素のｇｅｔＲｅａｄＭｅｔｈｏｄ（）を呼び出しｇｅｔｔｅｒメソッドのＭｅｔｈｏｄオブジェクトを得て、ａｃｃｅｓｓｏｒｓの各要素とする」動作であり、
１０行目は、「ｉｎｔ型の変数ｓｕｍを０で初期化する」動作であり、
１１行目は、「ａｃｃｅｓｓｏｒｓの各要素のＭｅｔｈｏｄオブジェクトごとに」ループする動作であり、
１２行目は、「ｉｎｖｏｋｅメソッドを通して、ｏｂｊの各属性のｇｅｔｔｅｒメソッドを呼び出す」動作であり、
１３行目は、「得られた結果をｉｎｔＶａｌｕｅ（）によりプリミティブ型のｉｎｔに変換して、ｓｕｍに足しこむ」動作であり、
１５行目は、「ｓｕｍの値を表示する」動作であり得る。
【００２７】
従来技術に係る上述の式［ＩＩ］の例においては、１つのオブジェクトにアクセスする場合を示すが、同じクラスの大量のオブジェクトに対してアクセスする必要がある場合には、繰り返し用いられ得る１２〜１３行目に相当する部分のオーバーヘッドが問題となる。第１のオーバーヘッドは、１２行目のｉｎｖｏｋｅ（）として表されるＭｅｔｈｏｄクラスの実装の限界によるオーバーヘッドであり、第２のオーバーヘッドは、利用しているコードにおいて、汎用的なオブジェクトを介してプリミティブ値にアクセスしなければならないオーバーヘッドである。具体的には、Ｏｂｊｅｃｔクラスの配列として引数を受け取る場合、又は引数や返り値がｉｎｔ等のプリミティブ型である場合に、従来技術においては、それらをラップ／アンラップする必要が生じることによるオーバーヘッドを回避できなかった。また、従来技術に係るリフレクションＡＰＩは汎用の用途を想定しており、どのように使われるかという情報を予め備えていないため、特有のアクセスに対する制御等の処理が追加され得る。このような制御が必要な場合には、リフレクションＡＰＩは更に遅延を生じ得る。
【００２８】
図２は、従来技術に係る、アクセサの動作を表すフロー図である。図２に示す、未知のオブジェクトへのアクセス処理の流れ２００は、アクセサを用いてオブジェクトを操作する利用側２１０に含まれるアプリケーションの動作、アクセサ側２２０の動作、及び対象のメソッド２３０の動作の諸段階を表すフロー図である。
【００２９】
従来技術に係る、未知のオブジェクトへのアクセス処理の流れ２００は、次のような諸段階を含む。なお、以下の記載に用いる用語「実際のメソッド」は、具体的なメソッドを指す。
Ｓ２５０：利用側２１０のアプリケーション等は、引数を準備する。具体的には、引数として用いる値をラップし、引数の配列を作成する。
Ｓ２５２：ｉｎｖｏｋｅ（）を呼ぶ。
Ｓ２６０：操作されるオブジェクトに対するアクセス権をチェックする。このとき、適宜、アクセス権の無い場合の所定のエラー処理等を実施してもよい。
Ｓ２６２：実際のメソッドに渡すための引数を準備する。具体的には、引数の配列へのアクセス権を設定し、引数として用いる値をアンラップする。
Ｓ２６４：実際のメソッドを呼ぶ。
Ｓ２７０：実際のメソッドを実行する。
Ｓ２８０：返り値を受け取る。
Ｓ２８２：ｉｎｖｏｋｅ（）の返り値を準備する。具体的には、返り値をラップする。
Ｓ２８４：ｉｎｖｏｋｅ（）の結果を返す。
Ｓ２９０：返り値を受け取る。
Ｓ２９２：返り値を利用するための準備を行う。具体的には、返り値をアンラップする。
【００３０】
このような、図２に示す従来技術に係るアクセサの動作は、前述の従来技術に係る式［ＩＩ］の１２〜１３行目における処理の流れ及びそのオーバーヘッドを含んでいる。具体的には、図２に示す諸段階の、Ｓ２５０及びＳ２９２からなる利用側２１０のアプリケーションにおけるオーバーヘッド、並びに、Ｓ２６０、Ｓ２６２及びＳ２８２からなるアクセサ側２２０におけるオーバーヘッドが挙げられる。
【００３１】
次いで、本発明に係るプログラミング・インタフェースについて説明する。
【００３２】
図３は、本発明の一実施形態に係る、アクセサの動作を表すフロー図である。図３に示す、発明を適用した場合のオブジェクトへのアクセスの処理の流れ３００は、次のような諸段階を含む。
Ｓ３００：利用側２１０のアプリケーション等は、本発明に係るアクセサ側２２０のｉｎｖｏｋｅ（）を呼ぶ。
Ｓ３１０：本発明に係る方法を含むアクセサ側２２０は、対象のメソッド２３０に対して、実際のメソッドを呼ぶ。
Ｓ３２０：実際のメソッドが実行される。
Ｓ３３０：本発明に係る方法を含むアクセサ側２２０は、対象のメソッド２３０から返り値を受け取る。
Ｓ３３２：本発明に係る方法を含むアクセサ側２２０は、利用側２１０のアプリケーション等に対してｉｎｖｏｋｅ（）の結果を返す。
Ｓ３４０：利用側２１０のアプリケーション等は返り値を受け取る。
【００３３】
更に、本発明に係るオブジェクトへのアクセス方法について説明する。一実施形態において、本発明に係る方法は、従来技術に係るリフレクション（Ｒｅｆｌｅｃｔｉｏｎ  ＡＰＩとも呼称）とは独立した、オブジェクトへの汎用的なアクセス方法を定めたプログラミング・インタフェースを提供する。これにより、例えば本発明に係るランタイムを利用して、アクセス対象のオブジェクトのクラスに特化したプログラム・コードを記述することが可能になる。本発明の実施形態に係るプログラミング・インタフェースにおいては、特定のプロパティに特化したインタフェースを用い得る。本発明に係るライブラリにおいては、指定されたインタフェースを実装する特化したメソッドを実行時にコード生成することにより、プロパティへの高速なアクセスを可能にする。
【００３４】
一実施形態において、本発明に係る方法を用いることにより、前述の式［ＩＩ］に示したアクセスの手順と同等のコードは、次式のように変更され得る。
【数３】
2010123060.tif 000005
【００３５】
本発明の一実施形態に係る上述の式［ＩＩＩ］において、
０１行目は、「変数ｏｂｊとして何らかのオブジェクトを受け取る」動作であり、
０２行目は、「ｏｂｊからクラス（Ｃｌａｓｓオブジェクト）をｂｅａｎＣｌａｓｓとして得る」動作であり、
０３行目は、「ｂｅａｎＣｌａｓｓから発明のｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒｓ（）を通じてＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列をａｃｃｅｓｓｏｒｓとして得る」動作であり、
０４行目は、「ｉｎｔ型の変数ｓｕｍを０で初期化する」動作であり、
０６行目は、「ａｃｃｅｓｓｏｒｓの各要素について」ループする動作であり、
０７行目は、「発明の、ｇｅｔＩｎｔＶａｌｕｅ（）というｉｎｔ型のプロパティに特化して高速化されたアクセサを呼び出し、ｏｂｊの各属性のｇｅｔｔｅｒメソッドを呼び出して属性の値をプリミティブ型の値として直接得て、それをｓｕｍに足しこむ」動作であり、
０９行目は、「ｓｕｍの値を表示する」動作であり得る。
【００３６】
本発明に係る上述の式［ＩＩＩ］の０７行目は、従来技術に係る式［ＩＩ］の１２〜１３行目に相当する部分である。本発明に係る式［ＩＩＩ］においては、この部分を実行することにより、図２に示した従来技術に係るＳ２５０及びＳ２９２、Ｓ２６０、並びに、Ｓ２６２及びＳ２８２からなるオーバーヘッドを回避し得る。すなわち、本発明に係る方法においては、利用したい型に特化したインタフェースを提供し、後述するコード生成により、当該インタフェースに特化したアクセス手段を備えたアクセサを生成することが可能である。これにより、本発明においては、従来技術によるオーバーヘッドを回避し得る。
【００３７】
より具体的には、本発明に係る上述の式［ＩＩＩ］に例示するオブジェクトへのアクセス手順は、次のようなメソッドを備えることにより構成され得る。まず、０３行目に含まれるＢｅａｎＡｃｃｅｓｓｏｒに続く静的（ｓｔａｔｉｃ）メソッドは、プロパティアクセサ・オブジェクトを生成するユーティリティ・メソッドであり、典型的には次式で表される。
【数４】
2010123060.tif 000006
このメソッドは、プロパティ記述ｐｒｏｐにより指定されるプロパティへのアクセサ・オブジェクトを生成し得る。生成されるアクセサ・オブジェクトのクラスは、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒインタフェース（又はクラス）のサブクラスであり得る。
【００３８】
次いで、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒインタフェース（又はクラス）は、次の式［Ｖ］のようなメソッド、式［ＶＩ］のようなプリミティブ型のプロパティ用のゲッタメソッド、及び式［ＶＩＩ］のようなプリミティブ型のプロパティ用のセッターメソッドを備え得る。
【数５】
2010123060.tif 000007
【数６】
2010123060.tif 000008
【数７】
2010123060.tif 000009
更に、これらのメソッドに対して、Ｆｉｌｔｅｒインタフェースとして、次の式［ＶＩＩＩ］のようなメソッドを用意してもよい。
【数８】
2010123060.tif 000010
【００３９】
このように、図３に示す、発明を適用した場合のオブジェクトへのアクセスの処理の流れ３００においては、上述の式［ＩＶ］〜［ＶＩＩＩ］に例示したメソッド及び式［ＩＩＩ］に例示したオブジェクトへのアクセス手順を用いることにより、従来技術とは異なってラップ／アンラップの動作を取り除くことが可能になる。具体的には、本発明に係る図３に示すアクセサの動作においては、従来技術に係るＳ２５０及びＳ２９２、Ｓ２６０、並びに、Ｓ２６２及びＳ２８２からなるオーバーヘッドを回避し得る。これにより、本発明に係る方法においては、型が未知のオブジェクトに対するアクセスを高速化することが可能になる。より具体的な、特定の型又はプロパティを有するオブジェクトに対するアクセスの高速化の例は、実施例を用いて後述する。
【００４０】
図４は、本発明の一実施形態に係る、オブジェクトにアクセスする手順を提供するライブラリの動作を表すフロー図である。
【００４１】
一実施形態において、図４に示すアクセサ・オブジェクトの生成４００は、アクセサＡＰＩメイン実装４１０、コード・ジェネレータ４２０、カスタム・クラス・ローダ４３０、及び特化アクセサ実装４４０を含む。アクセサＡＰＩメイン実装４１０は、本発明に係るライブラリを利用してオブジェクトにアクセスしようとするアプリケーション等からの要求を受信し、並びに生成したアクセサ・オブジェクトをアプリケーション等に送信する。コード・ジェネレータ４２０は、特定の型又はプロパティを有するオブジェクトにアクセスするための、特化したアクセサ用のバイトコードを生成する。カスタム・クラス・ローダ４３０は、コード・ジェネレータ４２０により生成されたバイトコードを実装するためにクラス・オブジェクトを生成する。特化アクセサ実装４４０は、カスタム・クラス・ローダ４３０により生成されたクラス・オブジェクトを用いてバイトコードを実装した状態であり、この特化アクセサ実装４４０に対して、アクセサＡＰＩメイン実装４１０がアプリケーション等から受信した要求に含まれる情報を入力することにより、当該情報に対応するアクセサからの返り値が出力される。
【００４２】
図４に示す、アクセサ・オブジェクトの生成４００の動作は、次のような諸段階を含む。
Ｓ４５０：オブジェクトにアクセスしようとするアプリケーション等は、アクセサに対する要求を送信する。
Ｓ４６０：アクセサＡＰＩメイン実装４１０は、当該要求に基づくバイトコードを生成するよう、コード・ジェネレータ４２０に指示を送信する。
Ｓ４６２：コード・ジェネレータ４２０は、生成したバイトコードをアクセサＡＰＩメイン実装４１０に送信する。
Ｓ４７０：アクセサＡＰＩメイン実装４１０は、生成されたバイトコードを実装するためのクラス・オブジェクトを生成するよう、カスタム・クラス・ローダ４３０に指示を送信する。
Ｓ４７２：カスタム・クラス・ローダ４３０は、生成したクラス・オブジェクトをアクセサＡＰＩメイン実装４１０に送信する。
Ｓ４７４：カスタム・クラス・ローダ４３０は、生成したクラス・オブジェクトを実装するよう、特化アクセサ実装４４０にロード命令を送信する。
Ｓ４８０：アクセサＡＰＩメイン実装４１０は、特化アクセサ実装４４０に新規インスタンスを送信する。具体的には、この新規インスタンスは、アクセサＡＰＩメイン実装４１０がアプリケーション等から受信した要求に含まれる情報であり得る。
Ｓ４８２：特化アクセサ実装４４０は、アクセサＡＰＩメイン実装４１０にアクセサ・オブジェクトを戻り値として送信する。
Ｓ４９０：アクセサＡＰＩメイン実装４１０は、オブジェクトにアクセスしようとするアプリケーション等にアクセサ・オブジェクトを戻り値として送信する。
【００４３】
例えば、前述のｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒ（）等のメソッドが呼ばれると、本発明に係るライブラリは、当該ライブラリを利用するアプリケーション等による所与のパラメータに基づき、コード・ジェネレータ４２０を用いて特化したアクセサ用のコードを生成し、カスタム・クラス・ローダ４３０を用いて生成されたクラスのバイトコードをロードし、ロードしたクラスのインスタンスを特化アクセサ実装４４０として生成し得る。
【００４４】
これらの、本発明に係るアクセサ・オブジェクトの生成４００における、バイトコードの生成を含む処理の流れについて、更に詳しく説明する。
【００４５】
図５は、本発明の一実施形態に係る、バイトコード生成の手順を示すフロー図である。図５に示す、バイトコード生成の処理の流れ５００は、上述の図４に示したアクセサ・オブジェクトの生成４００に含まれるコード・ジェネレータ４２０及びカスタム・クラス・ローダ４３０の動作であり得る。図５（ａ）はアクセサ・クラスを生成する手順、図５（ｂ）は参照型用のアクセサ・クラスを生成する手順、図５（ｃ）はプリミティブ型用のアクセサ・クラスを生成する手順を、それぞれ表している。
【００４６】
図５（ａ）に示すアクセサ・クラスを生成する手順において、本発明の一実施形態に係るコード・ジェネレータ４２０は、次のように動作し得る。
Ｓ５１０：アクセス対象のプロパティの型を調べる。
Ｓ５２０：プロパティの型が参照型であるか、プリミティブ型であるかを判定する。参照型であればＳ５３０に進み、プリミティブ型であればＳ５４０に進む。
Ｓ５３０：参照型用のアクセサ・クラスを生成する。
Ｓ５４０：プリミティブ型用のアクセサ・クラスを生成する。
【００４７】
図５（ｂ）に示す参照型用のアクセサ・クラスを生成するステップＳ５３０において、カスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ５３２：参照型用のｇｅｔ（Ｏｂｊｅｃｔ）を生成する。
Ｓ５３４：参照型用のｓｅｔ（ｇｅｔ（Ｏｂｊｅｃｔ））を生成する。
Ｓ５３６：参照型用のコピーのためのメソッドを生成する。
【００４８】
図５（ｃ）に示すプリミティブ型用のアクセサ・クラスを生成するステップＳ５４０において、カスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ５４２：プリミティブ型用のｇｅｔ（Ｏｂｊｅｃｔ）を生成する。
Ｓ５４４：プリミティブ型用のｇｅｔ（Ｏｂｊｅｃｔ，Ｏｂｊｅｃｔ）を生成する。
Ｓ５４６：プロパティの型用のｇｅｔＸＸＶａｌｕｅ（Ｏｂｊｅｃｔ）を生成する。
Ｓ５４８：プロパティの型用のｓｅｔＸＸＶａｌｕｅ（Ｏｂｊｅｃｔ，ｘｘ）を生成する。
Ｓ５４９：プリミティブ型用のコピーのためのメソッドを生成する。
【００４９】
このように、本発明の一実施形態に係るコード・ジェネレータ４２０の動作により、プロパティの型の差異に基づいてアクセサ・クラスが用意され得る。更に、本発明の一実施形態に係るカスタム・クラス・ローダ４３０の動作により、異なるプロパティの型の数だけ独立してｇｅｔ／ｓｅｔメソッド及びコピーのためのメソッドが用意され得る。従って、これらのメソッドごとに、異なるプロパティの型の数だけ独立して戻り値の型が用意され、異なるプロパティの型の数だけ独立して引数が用意され得る。
【００５０】
図５（ｂ）のＳ５３６、及び図５（ｃ）のＳ５４９は、それぞれ式［ＶＩＩＩ］に例示したフィルタ・オブジェクト等を適宜引数として、オブジェクトのプロパティをコピー（当技術分野に公知の「浅いコピー」）するためのメソッドであってもよく、更にこれに加えて参照先のインスタンスを複製する動作（当技術分野に公知の「深いコピー」）を実施してもよい。
【００５１】
図６は、上述の図５（ｂ）に示した参照型用のメソッドを生成する手順を示すフロー図である。図６（ａ）に示す参照型用のｇｅｔ（Ｏｂｊｅｃｔ）を生成するステップＳ５３２において、本発明に係るカスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ６０２：対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
Ｓ６０４：読み出しメソッドを呼ぶコードを生成する。
Ｓ６０６：呼び出した結果を返すコードを生成する。
【００５２】
また、図６（ｂ）に示す参照型用のｓｅｔ（Ｏｂｊｅｃｔ，Ｏｂｊｅｃｔ）を生成するステップＳ５３４において、本発明に係るカスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ６１２：対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
Ｓ６１４：設定値オブジェクトをプロパティの型にキャストするコードを生成する。
Ｓ６１６：書き込みメソッドを呼ぶコードを生成する。
【００５３】
図７は、上述の図５（ｃ）に示したプリミティブ型用のメソッドを生成する手順を示すフロー図である。図７（ａ）に示す、プリミティブ型用のｇｅｔ（Ｏｂｊｅｃｔ）を生成するステップＳ５４６において、本発明に係るカスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ６５２：対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
Ｓ６５４：読み出しメソッドを呼ぶコードを生成する。
Ｓ６５６：呼び出した結果を返すコードを生成する。
【００５４】
また、図７（ｂ）に示す、プロパティの型用のｓｅｔＸＸＶａｌｕｅ（Ｏｂｊｅｃｔ，ｘｘ）を生成するステップＳ５４８において、本発明に係るカスタム・クラス・ローダ４３０は、次のように動作し得る。
Ｓ６６２：対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
Ｓ６６４：書き込みメソッドを呼ぶコードを生成する。
【００５５】
図６及び図７を用いて示すコード生成は、参照型（プリミティブ型でない）のプロパティの場合、次式のようなテンプレートを埋めることによって行なわれてもよい。ただし、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの備えるメソッドは全て、実行時エラーを知らせる既定の実装が与えられている。生成されるアクセサ・クラスは、それらの一部を上書きして利用できるようにする。
【数９】
2010123060.tif 000011
【００５６】
本発明の一実施形態に係る上述の式［ＩＸ］において、
０１行目は、「テンプレート・パラメータ＄｛ａｃｃｅｓｓｏｒ  ｃｌａｓｓ｝で表される名前のクラスをＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒクラスのサブクラスとして宣言する」動作であり、
０２行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、汎用型の結果を返すメソッドｇｅｔ（）を宣言する」動作であり、
０３行目は、「テンプレート・パラメータ＄｛ｂｅａｎ  ｃｌａｓｓ｝にｔａｒｇｅｔをキャストし、テンプレート・パラメータ＄｛ｇｅｔｔｅｒ  ｍｅｔｈｏｄ｝という名前のメソッドを呼び出して返す」動作であり、
０５行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、汎用型の設定値をパラメータｖａｌｕｅにとるメソッドｓｅｔ（）を宣言する」動作であり、
０６行目は、「テンプレート・パラメータ＄｛ｂｅａｎ  ｃｌａｓｓ｝にｔａｒｇｅｔをキャストし、テンプレート・パラメータ＄｛ｐｒｏｐｅｒｔｙ  ｔｙｐｅ｝にｖａｌｕｅをキャストしたものを引数としてテンプレート・パラメータ＄｛ｓｅｔｔｅｒ  ｍｅｔｈｏｄ｝という名前のメソッドを呼び出す」動作であり、
０８〜０９行目は、「上記で定義されたｇｅｔ（）とｓｅｔ（）を使って２つのオブジェクトの同属性の値を一方から他方へコピーするメソッドを宣言する」動作であり、
１２〜１３行目は、「上記で定義されたｇｅｔ（）とｓｅｔ（）を使って２つのオブジェクトの同属性の値を一方から他方へ、フィルタをかけたものを設定するメソッドを宣言する」動作であり得る。
【００５７】
また、プリミティブ型のプロパティの場合は、次式のようなテンプレートを埋めることによってコードが生成され得る。
【数１０】
2010123060.tif 000012
式中、Ｉｎｔｅｇｅｒ等の特定の型を表す部分は必要に応じて変化し得る。
【００５８】
本発明の一実施形態に係る上述の式［Ｘ］において、
０１行目は、「テンプレート・パラメータ＄｛ａｃｃｅｓｓｏｒ  ｃｌａｓｓ｝で表される名前のクラスをＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒクラスのサブクラスとして宣言する」動作であり、
０２行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、汎用型の結果を返すメソッドｇｅｔ（）を宣言する」動作であり、
０３行目は、「後に定義するｇｅｔＩｎｔＶａｌｕｅ（）を使ってｔａｒｇｅｔにアクセスし、返り値をＩｎｔｅｇｅｒオブジェクトでラップして返す」動作であり、
０５行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、汎用型の設定値をパラメータｖａｌｕｅにとるメソッドｓｅｔ（）を宣言する」動作であり、
０６行目は、「ｖａｌｕｅをＩｎｔｅｇｅｒ型にキャストして、プリミティブ型の整数値を取り出すメソッドｉｎｔＶａｌｕｅ（）を呼び出し、結果を、後に定義するｓｅｔＩｎｔＶａｌｕｅ（）を使ってｔａｒｇｅｔにアクセスして設定する」動作であり、
０８行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、プリミティブ型に特化してｉｎｔの結果を返すメソッドｇｅｔＩｎｔＶａｌｕｅ（）を宣言する」動作であり、
０９行目は、「テンプレート・パラメータ＄｛ｂｅａｎ  ｃｌａｓｓ｝にｔａｒｇｅｔをキャストし、テンプレート・パラメータ＄｛ｇｅｔｔｅｒ  ｍｅｔｈｏｄ｝という名前のメソッドを呼び出して返す」動作であり、
１１行目は、「汎用型のターゲットをパラメータｔａｒｇｅｔにとり、プリミティブ型に特化してｉｎｔの設定値をパラメータｖａｌｕｅにとるメソッドｓｅｔ（）を宣言する」動作であり、
１２行目は、「テンプレート・パラメータ＄｛ｂｅａｎ  ｃｌａｓｓ｝にｔａｒｇｅｔをキャストし、ｖａｌｕｅを引数としてテンプレート・パラメータ＄｛ｓｅｔｔｅｒ  ｍｅｔｈｏｄ｝という名前のメソッドを呼び出す」動作であり、
１４行目は、「上記で定義されたｇｅｔＩｎｔＶａｌｕｅ（）とｓｅｔＩｎｔＶａｌｕｅ（）を使って２つのオブジェクトの同属性の値を、一方から他方へコピーするメソッドを宣言する」動作であり、
１７行目は、「上記で定義されたｇｅｔＩｎｔＶａｌｕｅ（）とｓｅｔＩｎｔＶａｌｕｅ（）を使って２つのオブジェクトの同属性の値を一方から他方へ、フィルタをかけたものを設定するメソッドを宣言する」動作であり得る。
【００５９】
上述の説明においてはソースコード表記を例示したが、別の実施形態においてソースコードで埋めてコンパイルしてもよく、更に別の実施形態においてバイトコードレベルのテンプレートを埋めてもよい。ソースコードレベルで行なう場合は、文字列の連結でファイルを生成して通常のＪａｖａ（登録商標）コンパイラにかければ必要なバイトコードが得られる。バイトコードレベルで行なう場合は、自前でバイトコードを生成してもよいが、ＢＣＥＬやＪａｖａｓｓｉｓｔのようなバイトコード編集ライブラリを用いて実装することもできる。
【００６０】
（バイトコードのテンプレートの例）
次式に、バイトコードのテンプレートの例を示す。通常のＪａｖａ（登録商標）バイトコードのフォーマットに従って、前半にコンスタントプール、後半にメソッド定義を含む形式を用いる。「／／」以降はコメントであり、実際のバイトコード（テンプレート）には反映されない。コンスタントプールの１６、１８、２１、２３〜２６の項目の文字列定数がパラメータ化されている。なお、用語「実際のバイトコード」は、具体的なバイトコードを指す。
【数１１】
2010123060.tif 000013
【００６１】
（プログラミング・インタフェースを用いる応用）
次式に、ＢｅａｎＡｃｃｅｓｓｏｒのユーティリティ・メソッドとして、所与のクラスから、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒクラスのプロパティアクセサ・オブジェクトをプロパティ分だけ生成する例を示す。
【数１２】
2010123060.tif 000014
【００６２】
本発明の一実施形態に係る上述の式［ＸＩＩ］において、
０１行目は、「クラス（Ｃｌａｓｓオブジェクト）を引数にとりＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列を返すメソッドｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒｓを宣言する」動作であり、
０２行目は、「従来のＢｅａｎのライブラリＩｎｔｒｏｓｐｅｃｔｏｒのｇｅｔＢｅｎａＩｎｆｏを通じて、ＢｅａｎＩｎｆｏオブジェクトを取得する」動作であり、
０３行目は、「従来のライブラリを用いて、プロパティ記述である、ＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒを取得する」動作であり、
０４行目は、「発明のＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列をＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒの配列と同じ大きさで生成する」動作であり、
０５行目は、「各ＰｒｏｐｅｒｔｙＤｅｓｃｒｉｐｔｏｒから、発明のｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒを使ってＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒを取得し、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列の各要素とする」動作であり、
０９行目は、「生成して設定したＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列を返す」動作であり得る。
【００６３】
（インヴォーカを利用するプログラミング・インタフェースの例）
本発明に係る方法は、インヴォーカ・オブジェクトを生成するユーティリティ・メソッドとして、次式のように利用されるＢｅａｎＡｃｃｅｓｓｏｒのｓｔａｔｉｃメソッドｇｅｔＭｅｔｈｏｄＩｎｖｏｋｅｒ（）を含み得る。
【数１３】
2010123060.tif 000015
【００６４】
本発明の一実施形態に係る上述の式［ＸＩＩＩ］において、
０１行目は、「変数ｏｂｊとして何らかのオブジェクトを受け取る」動作であり、
０２行目は、「ｏｂｊからクラス（Ｃｌａｓｓオブジェクト）をｂｅａｎＣｌａｓｓとして得る」動作であり、
０３行目は、「ｂｅａｎＣｌａｓｓから何らかのＭｅｔｈｏｄオブジェクトを得る」動作であり、
０４行目は、「既知のクラスＡｐｐＦａｃｅの既知のメソッドｉｎｖｏｋｅ（）のＭｅｔｈｏｄオブジェクトを得る」動作であり、
０５行目は、「発明のｇｅｔＭｅｔｈｏｄＩｎｖｏｋｅｒ（）により、ｋｎｏｗｎＭｅｔｈｏｄを通じてｔａｒｇｅｔＭｅｔｈｏｄを高速に呼び出すように生成されたクラスのインスタンス・オブジェクトをｉｎｖｏｋｅｒ変数として得る」動作であり、
０６行目は、「ｉｎｖｏｋｅｒ変数の既知のメソッドｉｎｖｏｋｅ（）に対し、未知の対象オブジェクト（ｏｂｊ）に加え、既知の型のパラメータ列である文字列（“Ｈｅｌｌｏ”）と整数値（２）の３つのパラメータを渡して呼び出す」動作であり得る。
【００６５】
ただし、式中、ＡｐｐＦａｃｅは既知のインタフェースであり、次のようになっているとする。
【数１４】
2010123060.tif 000016
【００６６】
ＡｐｐＦａｃｅはユーザにより与えられるインタフェースであり、その形態は限定しないが、未知の呼び出し対象メソッド（変数ｔａｒｇｅｔＭｅｔｈｏｄで指されている）に適合するメソッド（この場合ｉｎｖｏｋｅ（）で、変数ｋｎｏｗｎＭｅｔｈｏｄで指されている）を備えたものである必要がある。簡単には、呼び出し対象メソッドの引数（この場合、ｉｎｖｏｋｅ（）の  ｍｅｓｓａｇｅとｃｏｕｎｔに相当する引数）に任意のオブジェクト（例ではｉｎｖｏｋｅ（）のｔａｒｇｅｔ引数）を受け取れる引数を追加したものとなる。好ましくは、より柔軟な対応関係決定方針をユーザが与えられるようにしてもよい。
【００６７】
生成されるオブジェクトのクラスは、プロパティの場合と同様に、対象メソッドに特化したコードを実装したものとなる。ただし、そのインタフェースは、プロパティの場合とは異なり、指定されたもの（この場合ＡｐｐＦａｃｅ）となる。
【数１５】
2010123060.tif 000017
【００６８】
本発明の一実施形態に係る上述の式［ＸＶ］において、
０１行目は、「テンプレート・パラメータ＄｛ｉｎｖｏｋｅｒ  ｃｌａｓｓ｝で表される名前のクラスをテンプレート・パラメータ＄｛ｉｎｖｏｋｅｒ  ｆａｃｅ｝で表されるインタフェースを実装するクラスとして宣言（例の場合においてはＡｐｐＦａｃｅを実装）する」動作であり、
０２行目は、「テンプレート・パラメータ＄｛ｒｅｔｕｒｎ  ｔｙｐｅ｝  （ｔａｒｇｅｔの型）型の結果を返し、汎用型のターゲットをパラメータｔａｒｇｅｔに加え、ｔａｒｇｅｔ（のあるメソッド）に特化した特定の引数（ＡｐｐＦａｃｅ）とり、テンプレート・パラメータ＄｛ｉｎｖｏｋｅｒ  ｎａｍｅ｝（既知のメソッドの名前）を名前にもつメソッドを宣言する」動作であり、
０３行目は、「コード生成時にわかるターゲットの型であるテンプレート・パラメータ＄｛ｔａｒｇｅｔ  ｔｙｐｅ｝にｔａｒｇｅｔをキャストして、ｔａｒｇｅｔ以外の残りの引数をそのまま渡し、コード生成時にわかるターゲットのメソッド名である＄｛ｔａｒｇｅｔ  ｍｅｔｈｏｄ｝をメソッド名としてメソッドを呼び出し、返り値をそのまま返す」動作であり得る。
【００６９】
［プログラミング装置のハードウェア構成］
図８は、本実施形態に係る、プログラミング装置のハードウェア構成を示す図である。図８においては、プログラミング装置を情報処理装置１０００とし、そのハードウェア構成を例示する。以下は、コンピュータを典型とする情報処理装置として全般的な構成を説明するが、その環境に応じて必要最小限な構成を選択できることはいうまでもない。
【００７０】
情報処理装置１０００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０１０、バスライン１００５、通信Ｉ／Ｆ１０４０、メインメモリ１０５０、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ  Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）１０６０、パラレルポート１０８０、ＵＳＢポート１０９０、グラフィック・コントローラ１０２０、ＶＲＡＭ１０２４、音声プロセッサ１０３０、Ｉ／Ｏコントローラ１０７０、並びにキーボード及びマウス・アダプタ１１００等の入力手段を備える。Ｉ／Ｏコントローラ１０７０には、フレキシブル・ディスク（ＦＤ）ドライブ１０７２、ハードディスク１０７４、光ディスク・ドライブ１０７６、半導体メモリ１０７８等の記憶手段を接続することができる。メインメモリ１０５０は、例えばダイナミック・ランダムアクセス・メモリ等の任意のメモリ・デバイスを用いて構成される。
【００７１】
音声プロセッサ１０３０には、マイクロホン１０３６、増幅回路１０３２、及びスピーカ１０３４が接続される。また、グラフィック・コントローラ１０２０には、表示装置１０２２が接続されている。
【００７２】
ＢＩＯＳ１０６０は、情報処理装置１０００の起動時にＣＰＵ１０１０が実行するブートプログラムや、情報処理装置１０００のハードウェアに依存するプログラム等を格納する。ＦＤ（フレキシブル・ディスク）ドライブ１０７２は、フレキシブル・ディスク１０７１からプログラム又はデータを読み取り、Ｉ／Ｏコントローラ１０７０を介してメインメモリ１０５０又はハードディスク１０７４に提供する。図８には、情報処理装置１０００の内部にハードディスク１０７４が含まれる例を示したが、バスライン１００５又はＩ／Ｏコントローラ１０７０に外部機器接続用インタフェース（図示せず）を接続し、情報処理装置１０００の外部にハードディスクを接続又は増設してもよい。
【００７３】
光ディスク・ドライブ１０７６としては、例えば、ＤＶＤ−ＲＯＭドライブ、ＣＤ−ＲＯＭドライブ、ＤＶＤ−ＲＡＭドライブ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｋ）−ＲＯＭドライブ等を使用することができる。この際は各ドライブに対応した光ディスク１０７７を使用する必要がある。光ディスク・ドライブ１０７６は光ディスク１０７７からプログラム又はデータを読み取り、Ｉ／Ｏコントローラ１０７０を介してメインメモリ１０５０又はハードディスク１０７４に提供することもできる。
【００７４】
情報処理装置１０００に提供されるコンピュータ・プログラムは、フレキシブル・ディスク１０７１、光ディスク１０７７、又はメモリカード等の記録媒体に格納されて利用者によって提供される。このコンピュータ・プログラムは、Ｉ／Ｏコントローラ１０７０を介して、記録媒体から読み出され、又は通信Ｉ／Ｆ１０４０を介してダウンロードされることによって、情報処理装置１０００にインストールされ実行される。コンピュータ・プログラムが情報処理装置に働きかけて行わせる動作は、既に説明した装置における動作と同一であるので省略する。
【００７５】
前述のコンピュータ・プログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としてはフレキシブル・ディスク１０７１、光ディスク１０７７、又はメモリカードの他に、ＭＤ等の光磁気記録媒体、テープ媒体を用いることができる。また、専用通信回線やインターネットに接続されたサーバシステムに設けたハードディスク又は光ディスク・ライブラリ等の記憶装置を記録媒体として使用し、通信回線を介してコンピュータ・プログラムを情報処理装置１０００に提供してもよい。
【００７６】
以上の例は、情報処理装置１０００について主に説明したが、コンピュータに、情報処理装置で説明した機能を有するプログラムをインストールして、そのコンピュータを情報処理装置として動作させることにより上記で説明した情報処理装置と同様な機能を実現することができる。
【００７７】
本装置は、ハードウェア、ソフトウェア、又はハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアの組み合わせによる実施では、所定のプログラムを有するコンピュータ・システムでの実施が典型的な例として挙げられる。係る場合、該所定のプログラムが該コンピュータ・システムにロードされ実行されることにより、該プログラムは、コンピュータ・システムに本発明に係る処理を実行させる。このプログラムは、任意の言語、コード、又は表記によって表現可能な命令群から構成される。そのような命令群は、システムが特定の機能を直接実行すること、又は（１）他の言語、コード、もしくは表記への変換、（２）他の媒体への複製、のいずれか一方もしくは双方が行われた後に、実行することを可能にするものである。もちろん、本発明は、そのようなプログラム自体のみならず、プログラムを記録した媒体を含むプログラム製品もその範囲に含むものである。本発明の機能を実行するためのプログラムは、フレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ハードディスク装置、ＲＯＭ、ＲＡＭ、フラッシュメモリ等の任意のコンピュータ可読媒体に格納することができる。係るプログラムは、コンピュータ可読媒体への格納のために、通信回線で接続する他のコンピュータ・システムからダウンロードしたり、他の媒体から複製したりすることができる。また、係るプログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。
【００７８】
（実施例１：バイトコードの生成例）
本発明に係る方法の実施例として、所与のクラスに基づいてバイトコードを生成する例を示す。次のような、クラスＢａｎｋＩｎｆｏがランタイムに与えられたとする。
【数１６】
2010123060.tif 000018
【００７９】
本発明に係るライブラリに含まれるＢｅａｎＡｃｃｅｓｓｏｒ．ｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒｓ（）、又はＢｅａｎＡｃｃｅｓｓｏｒ．ｇｅｔＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒ（）等により、このクラスのオブジェクトへ高速にアクセスするためのコードが生成され得る。具体的には、ＢａｎｋＩｎｆｏのプロパティのうち、Ｓｔｒｉｎｇ型のプロパティｂｒａｎｃｈに対して、本発明のライブラリは、例えば、次式に相当するバイトコードを生成することが可能である。
【数１７】
2010123060.tif 000019
【００８０】
また、ＢａｎｋＩｎｆｏのプロパティのうち、ｉｎｔ型のプロパティｉｄに対して、本発明のライブラリは、次に相当するバイトコードを生成し得る。
【数１８】
2010123060.tif 000020
【００８１】
（実施例２：バイトコードのコンスタントプール部分の例）
次の式［ＸＩＸ］に例示するアクセス対象クラスに対して、本発明により、前述の式［Ｘ］に示したテンプレートから生成されるバイトコードのコンスタントプール部分の一部を、式［ＸＸ］に例示する。
【数１９】
2010123060.tif 000021
【数２０】
2010123060.tif 000022
【００８２】
（実施例３：オブジェクトへのアクセスの高速化の例）
本発明に係る方法を用いてオブジェクトにアクセスすることにより、未知のクラスのオブジェクトに対して汎用的かつ高速なアクセスが可能になる。表１は、オブジェクトのディープコピーを様々な方法で実装したものの実行時間を比較したものである。実行環境としては、ランタイムとして「Ｓｕｎ  Ｊａｖａ  ２  Ｒｕｎｔｉｍｅ  Ｅｎｖｉｒｏｎｍｅｎｔ，  Ｓｔａｎｄａｒｄ  Ｅｄｉｔｉｏｎ，  ｖｅｒｓｉｏｎ  １．４．２  ＨｏｔＳｐｏｔ  Ｓｅｒｖｅｒ  ＶＭ」を、オペレーティングシステムとして「Ｌｉｎｕｘ  ２．４．１８−１４」を、ハードウェアとして「ＩＢＭ  ｉｎｔｅｌｌｉＳｔａｔｉｏｎ  Ｍ  Ｐｒｏ，ａ  ｓｉｎｇｌｅ  Ｐｅｎｔｉｕｍ（登録商標）  ４  Ｐｒｏｃｅｓｓｏｒ  ２．４ＧＨｚ，  ２ＧＢ  ｍｅｍｏｒｙ」をそれぞれ用いた。表１のコピーコードとして区別される項目において、Ｈａｎｄ−ｗｒｉｔｔｅｎは手で最善と思われるコピーを実装したもの、Ｇｅｎｅｒａｔｅｄ  ｓｏｕｒｃｅ  ｃｏｄｅは、本発明と同等のコードをソースコードとして生成してコンパイルしたもの、Ｇｅｎｅｒａｔｅｄ  ｂｙｔｅｃｏｄｅが本発明によるもの、Ｒｅｆｌｅｃｔｉｏｎは従来技術に係るリフレクション（Ｒｅｆｌｅｃｔｉｏｎ  ＡＰＩ）を用いたものである。本発明により生成されたバイトコードと、従来技術に係るリフレクションを用いたものとでは数十倍の差が生じ、本発明の方法によりオブジェクト操作の高速化を達成することが可能であった。
【表１】
2010123060.tif 000023
【００８３】
また、本発明では、コード生成される部分が、鍵となる小さな部分に限られているため、本発明のＡＰＩを用いた汎用プログラムの保守性、特にデバッガを用いたデバッグのしやすさは、全てを実行時にコード生成する場合に比べ、リフレクションを用いた汎用プログラム程度に、良好になり得る。コード生成のコストも小さくなることが期待できる。
【００８４】
（実施例４：シリアライザへの実装の例）
更に、本発明は、例えば次式に示すようなシリアライザに実装することが可能であり、現実的なアプリケーションとして利用し得る。
【数２１】
2010123060.tif 000024
【００８５】
本発明の実装例に係る式［ＸＸＩ］において、
０１行目は、「シリアライザを実装したクラスＭｙＳｅｒｉａｌｉｚｅｒ全体を宣言する」動作であり、
０２行目は、「シリアライズ対象のオブジェクトのクラスを表すクラス・オブジェクトを保持しておく、Ｃｌａｓｓ型のフィールドｔａｒｇｅｔＣｌａｓｓを宣言する」動作であり、
０３行目は、「シリアライズ対象のオブジェクトの各プロパティへのアクセサ・オブジェクト（ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒ型）をキャッシュしておく、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒの配列型のフィールドｐｒｏｐｓを宣言する」動作であり、
０４行目は、「シリアライズ対象のオブジェクトの各プロパティの型を表すクラス・オブジェクト（Ｃｌａｓｓ型）をキャッシュしておく、Ｃｌａｓｓの配列型のフィールドｔｙｐｅｓを宣言する」動作であり、
０５行目は、「ＭｙＳｅｒｉａｌｉｚｅｒオブジェクトのコンストラクタ・シリアライズ対象のクラスの設定（ｔａｒｇｅｔＣｌａｓｓ）の後、前述の本発明に係る式［ＩＩＩ］と同様にアクセサをキャッシュ（ｐｒｏｐｓ）することに加え、各プロパティの型のキャッシュ（ｔｙｐｅｓ）を初期化する」動作であり、
２０行目は、「シリアライズの処理を行うメソッドｓｅｒｉａｌｉｚｅＩｎｔｏ（）を宣言し、シリアライズ結果出力先ｏｕｔと、シリアライズ対象のオブジェクトｏｂｊを引数とする」動作であり、
２１行目は、「シリアライズ対象のオブジェクトが初期化時に設定されたクラスのときのみ処理を行う（２２−３０）が、そうでなければ、例外をあげる（３２）」動作であり、
２２行目は、「各アクセサについて以下の処理を行う」動作であり、
２３行目は、「プロパティの型がｉｎｔであれば、ｏｂｊに対して、ｉｎｔに特化したアクセス・メソッドｇｅｔＩｎｔＶａｌｕｅ（）を呼び出してプロパティの値を取り出し、整数値を書き出すためのメソッドｗｒｉｔｅＩｎｔ（）をｏｕｔに対して呼ぶ」動作であり、
２５行目は、「プロパティの型がｄｏｕｂｌｅであれば、ｏｂｊに対して、ｄｏｕｂｌｅに特化したアクセス・メソッドｇｅｔＤｏｕｂｌｅＶａｌｕｅ（）を呼び出してプロパティの値を取り出し、小数値を書き出すためのメソッドｗｒｉｔｅＤｏｕｂｌｅ（）をｏｕｔに対して呼ぶ」動作であり、
２７行目は、「プロパティの型がＳｔｒｉｎｇであれば、ｏｂｊに対して、汎用的なアクセス・メソッドｇｅｔ（）を呼び出してプロパティの値を取り出し、Ｓｔｒｉｎｇ型にキャストした上で文字列を書き出すためのメソッドｗｒｉｔｅＵＴＦ（）をｏｕｔに対して呼ぶ」動作であり得る。
【００８６】
このような実装の例においては、メソッドｓｅｒｉａｌｉｚｅＩｎｔｏ（）が実行時に何度も呼ばれることになるが、少なくとも実行オーバーヘッドとなり得るＲｅｆｌｅｃｔｉｏｎ  ＡＰＩを利用することなく、シリアライザを実現することが可能である。
【００８７】
（実施例５：クラスの例）
本発明に係る方法において、例えばカスタム・クラス・ローダ４３０が生成するクラスには、ＰｒｏｐｅｒｔｙＡｃｃｅｓｓｏｒクラスとして、次の式を用い得る。
【数２２】
2010123060.tif 000025
【００８８】
（実施例６：コード生成プログラムの例）
本発明に係るオブジェクトのアクセス方法は、例えば、バイトコード編集ライブラリＪａｖａｓｓｉｓｔを用いて、次式のように実装してもよい。
【数２３】
2010123060.tif 000026
【００８９】
以上、本発明を実施形態に則して説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態又は実施例に記載されたものに限定されるものではない。
【図面の簡単な説明】
【００９０】
【図１】本発明の一実施形態に係る、アクセサ１２０の概略を表す説明図である。
【図２】従来技術に係る、アクセサの動作を表すフロー図である。
【図３】本発明の一実施形態に係る、アクセサの動作を表すフロー図である。
【図４】本発明の一実施形態に係る、オブジェクトにアクセスする手順を提供するライブラリの動作を表すフロー図である。
【図５】本発明の一実施形態に係る、バイトコード生成の手順を示すフロー図である。
【図６】本発明の一実施形態に係る、参照型用のメソッドを生成する手順を示すフロー図である。
【図７】本発明の一実施形態に係る、プリミティブ型用のメソッドを生成する手順を示すフロー図である。
【図８】本発明の一実施形態に係る、プログラミング装置のハードウェア構成を示す図である。
【符号の説明】
【００９１】
１０５  ユーザ
１１０  プログラミング・インタフェース
１２０  アクセサ
１３０  クラス
２１０  利用側
２２０  アクセサ側
２３０  対象のメソッド
３００  本発明を適用した場合のオブジェクトへのアクセスの処理の流れ
４００  アクセサ・オブジェクトの生成
４１０  アクセサＡＰＩメイン実装
４２０  コード・ジェネレータ
４３０  カスタム・クラス・ローダ
４４０  特化アクセサ実装
５００  バイトコード生成の処理の流れ
６００  参照型プロパティへのアクセス用コード生成の処理の流れ
６５０  プリミティブ型プロパティへのアクセス用コード生成の処理の流れ
１０００  情報処理装置
【図１】
2010123060.tif 000027
【図２】
2010123060.tif 000028
【図３】
2010123060.tif 000029
【図４】
2010123060.tif 000030
【図５】
2010123060.tif 000031
【図６】
2010123060.tif 000032
【図７】
2010123060.tif 000033
【図８】
2010123060.tif 000034
【手続補正書】
【提出日】平成20年11月21日(2008.11.21)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項８
【補正方法】変更
【補正の内容】
【請求項８】
前記アプリケーション・プログラムが前記オブジェクトにアクセスすることに応答して、
前記アクセスされるオブジェクトを引数とするメソッドを用意するステップは、前記メソッドに基づくコードを生成する、
請求項７に記載のライブラリを作成する方法。
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項９
【補正方法】変更
【補正の内容】
【請求項９】
前記メソッドに基づく前記コードは、予め用意したテンプレートに基づくバイトコードである、
請求項８に記載のライブラリを作成する方法。