Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP5419033B2 - 未知のオブジェクトにアクセスする方法 - Google Patents
[go: Go Back, main page]

JP5419033B2 - 未知のオブジェクトにアクセスする方法 - Google Patents

未知のオブジェクトにアクセスする方法 Download PDF

Info

Publication number
JP5419033B2
JP5419033B2 JP2008298346A JP2008298346A JP5419033B2 JP 5419033 B2 JP5419033 B2 JP 5419033B2 JP 2008298346 A JP2008298346 A JP 2008298346A JP 2008298346 A JP2008298346 A JP 2008298346A JP 5419033 B2 JP5419033 B2 JP 5419033B2
Authority
JP
Japan
Prior art keywords
class
accessor
present
type
line
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2008298346A
Other languages
English (en)
Other versions
JP2010123060A (ja
Inventor
道昭 立堀
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2008298346A priority Critical patent/JP5419033B2/ja
Publication of JP2010123060A publication Critical patent/JP2010123060A/ja
Application granted granted Critical
Publication of JP5419033B2 publication Critical patent/JP5419033B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、未知のオブジェクトにアクセスする方法に関し、特にアプリケーション・プログラミング・インタフェースとして提供し得る、未知の型のオブジェクトに高速にアクセスする方法に関する。
従来、種々の型のデータ又は種々のデータセットの様式を含む様々な形態のデータへの柔軟なアクセスを容易にするために、例えば、Java(登録商標)2 Standard Edition(Java SE)技術スイートの構成要素であり、再利用可能なソフトウェア・コンポーネントであるJavaBean仕様に見られる、ソフトウェア・コンポーネントへのアクセス方法をカプセル化する技術が知られている(非特許文献1)。この技法によれば、データの所与の組にアクセスするためにアプリケーション・プログラム・インターフェース(API)の組が公開され、データの新しい組にアクセスする時には必ず規定の形式を用いて、ソフトウェアを記述することを必要とする。このため、リレーショナル・データベース・システム等によりデータの新しい組へのアクセスが必要となる場合等、特に、アクセス方法をカプセル化(クラス内部の属性を外部から隠し、必ずメソッドを通してアクセスさせる方法を指す)する技術及び他の類似する手法を用いる場合に、オーバーヘッドを生じ、維持にコストを要していた。
"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/>
従来技術に係る未知の型のオブジェクトを取り扱える仕組みであるJava(登録商標)におけるJavaBeans又はこの関連技術の利用においては、リフレクションと呼ばれる機構が使われ、これは実行オーバーヘッドが大きいことが知られている。リフレクションは、APIとして汎用的な型で引数や返り値の型が固定されているため、例えば引数や返り値の型がプリミティブである場合にラップ/アンラップのステップが必要であり、オーバーヘッドを回避できない。類似の方法であるApacheのBeanUtilsも、リフレクションAPIのメソッドクラスによりオブジェクトへのアクセサを表現しているため、同様にオーバーヘッドを生じる。一般的には、特定のAPIの機能を置き換え可能なコードを生成して高速化する手法も想定し得るが、オブジェクトの態様が不明である場合には、コード生成を具体的に設計するための仕様の確定が困難である。更に、様々な型のオブジェクトにアクセスするために汎用性を確保すると、オブジェクトへのアクセスの高速化が犠牲になる場合がある。
本発明は、実行のオーバーヘッドの増大を回避し得る、未知の型のオブジェクトを取り扱える方法を提供することを目的とし、特にアプリケーション・インタフェースとしてこのような方法を提供することを目的とする。更に本発明は、本発明に係る方法をプログラミング環境又は実行時のランタイムにおいて利用可能なライブラリとして提供することを目的とする。
本発明は上記課題に鑑み、以下のような解決手段を提供する。なお、本願明細書の用語「アクセサ」は、オブジェクトの属性やプロパティを取得するメソッド(getter)と設定するメソッド(setter)との対を指す。
本発明は、オブジェクトの属性を読み書きするメソッドであるgetter/setterメソッドによるアクセス、又は、ユーザにより指定される任意のシグネチャのメソッド呼び出しにおいて、未知のオブジェクトに対して汎用的なアクセスを許容するプログラミング・インタフェースを提供する。
一態様において、本発明は、未知の型のオブジェクトへの汎用的なアクセス手段を備えたライブラリにおいて、従来技術に係るリフレクションAPIを用いず、プロパティのアクセスに特化したインタフェースを提供する。当該インタフェースは次の特徴を有する。
(特徴−1)プロパティ読み出しメソッド及び、プロパティ書き込みメソッドは、読み書き対象のオブジェクトを引数とする。
(特徴−2)読み出しメソッドは、プロパティの型を戻り値の型とする。
(特徴−3)書き込みメソッドは、対象オブジェクトの引数に加えて、プロパティの型の引数をとり得る。
(特徴−4)様々なプロパティの型に対応できるように、プリミティブ型及び参照型のそれぞれに特化したプロパティ読み書き用メソッドを提供する。すなわち、これらの特徴により、プロパティの型の差異に基づいて、異なるプロパティの型の数だけ独立してメソッドが用意され、異なるプロパティの型の数だけ独立して戻り値の型が用意され、異なるプロパティの型の数だけ独立して引数が用意され得る。更に、当該インタフェースは次の特徴を有する。
(特徴−5)2つのオブジェクトの一方から他方へプロパティをコピーするためのメソッドを提供する。当該メソッドは2つの対象オブジェクトを引数とする。
(特徴−6)変形として、コピー時に浅いコピーや深いコピー等の制御を行ない得るフィルタ・
オブジェクトを引数とすることも可能である。
別の態様において、本発明は、ユーザから与えられた2つのメソッド情報に基づいて、メソッド呼び出し実行において、従来技術に係るリフレクションAPIを用いずに、未知のオブジェクトのメソッドを呼び出し得るライブラリを提供する。当該ライブラリは次の特徴を有する。
(特徴−7)アクセス対象オブジェクトのメソッド情報、及び既知のインタフェースのメソッド情報を与えられると、アクセス対象オブジェクト上の指定されたメソッド呼び出しを、既知のインタフェースを通じて行えるようにするインヴォーカ(invoker)・オブジェクトを返す。
(特徴−8)インヴォーカ・オブジェクトのメソッド呼び出しメソッドは、通常の引数に加えて、呼び出し対象のオブジェクトを引数とする。
また別の態様において、本発明は、上記のインタフェース及びライブラリの実装において、実行時にコード生成を行なうことにより、従来技術に係るリフレクション機構を用いずに、特化されたコードによる高速なオブジェクトへのアクセスを可能にする機構を提供する。
更に別の態様において、本発明は、実行時のコード生成において、コードテンプレートの構成方法及びこれを用いるバイトコード生成方法を提供する。
このようにして、本発明に係るプログラミング・インタフェースは、次の機能を備えることが可能になる。
(機能−1)本発明に係るプログラミング・インタフェースは、アクセスするフィールドの型がプリミティブ型の場合にも、プリミティブ型の値を直接利用し得る。
(機能−2)本発明に係るプログラミング・インタフェースは、呼び出すメソッドの返り値やパラメータの型がプリミティブ型の場合にも、プリミティブ型の値を直接利用し得る。
(機能−3)本発明に係るプログラミング・インタフェースは、アクセス対象のオブジェクトのクラスに特化したランタイム用のコードを生成し得る。この生成コードにおいては、getter/setterメソッドや、指定されたメソッドが直接呼び出される。
本発明に係るプログラミング・インタフェースにおいては、従来技術に係るリフレクションに替えてこれらの機能を用いることにより、未知の型を持つオブジェクトへの、高速なアクセスが可能になる。
本発明は、スクリプト言語を用いるプログラム開発言語、ハイパーテキスト等を解釈して実行するブラウザ及びこれを利用するプログラム開発環境、バイトコードを解釈して実行するインタプリタ及びその環境、コンパイラ、又はリレーショナル・データベース技術等の、既存の技術と組み合わせることができ、そのように組み合わせた技術もまた、本発明の技術範囲に含まれる。同様に、本発明の技法を含むアプリケーション開発環境又はデータベース・システム等も、本発明の技術範囲に含まれる。更に、本発明の技法は、オブジェクトにアクセスするための諸段階を、FPGA(現場でプログラム可能なゲートアレイ)、ASIC(特定用途向け集積回路)、これらと同等のハードウェアロジック素子、プログラム可能な集積回路、又はこれらの組み合わせが記憶し得るプログラムの形態、すなわちプログラム製品として提供し得る。具体的には、データ入出力、データバス、メモリバス、システムバス等を備えるカスタムLSI(大規模集積回路)の形態として、本発明に係るオブジェクトにアクセスするための手段を提供でき、そのように集積回路に記憶されたプログラム製品の形態も、本発明の技術範囲に含まれる。
本発明によれば、プリミティブ型の値を直接利用し得るインタフェースを用意することにより、従来技術に係るリフレクションにおいて問題であった、未知の型のオブジェクトにアクセスする場合に発生し得るオーバーヘッドの増大を回避し得る。また、本発明によれば、未知の型のオブジェクトにアクセスする方法をアプリケーション・インタフェースとして提供することにより、他のアプリケーションから本発明の方法を利用することが可能になる。更に本発明によれば、本発明に係る方法をプログラミング環境又は実行時のランタイムにおいて利用可能なライブラリとして提供することにより、バイトコードを実行させるプログラミング環境又はスクリプト言語等から本発明の方法を利用することが可能になる。
以下、本発明の実施形態について式及び図を参照しながら説明する。なお、これらはあくまでも一例であって、本発明の技術的範囲はこれらに限られるものではない。
図1は、本発明の一実施形態に係る、アクセサ120の概略を表す説明図である。ユーザ105は、任意に所望するオブジェクトを操作するためにプログラミング・インタフェース110を用い得る。好適なプログラミング・インタフェース110は、例えばJava(登録商標)のアプリケーション・プログラミング・インタフェースであり得るが、これに限定せず、任意のオブジェクト指向言語のアプリケーション・プログラミング・インタフェースを想定する。プログラミング・インタフェース110は、プログラムの単位であるクラス130にアクセスするために、アクセサ120を用い得る。典型的には、アクセサ120の役割は、プログラミング・インタフェース110により指定された特定のクラス130を利用するために、当該クラス130のメソッドが取り扱うことのできる形式の引数を用意すること、及び当該クラス130のメソッド呼び出しの結果を戻り値としてプログラミング・インタフェース110に返すことである。すなわち、アクセサ120は、プログラミング・インタフェース110とクラス130との間においてアプリケーション・プログラム・インタフェース(APIと略称、Application Program Interface)を実装するライブラリとして動作することができる。
一実施形態において、本発明に係るアクセサ120は、プログラミング・インタフェース110及びクラス130と協動し、次のように動作し得る。ここで、プログラミング・インタフェース110、アクセサ120及びクラス130は同一のコンピュータ装置等に実装されてもよく、ネットワークを介するサーバ装置等に分散して配置されてもよい。
S110:ユーザ105は、プログラミング・インタフェース110に対してオブジェクト操作等の要求を送信する。
S120:プログラミング・インタフェース110は、当該要求のうち、操作されるオブジェクトの属性及び/又はプロパティを取得及び/又は設定するために、アクセサ120を呼び出す。
S130:アクセサ120は、操作されるオブジェクトの属性及び/又はプロパティを取得及び/又は設定し、オブジェクトに対する操作を実行するクラス130のメソッドにこれらの値を引き渡し、実行制御をクラス130のメソッドに移行する。
S140:クラス130のメソッドは、オブジェクトに対する操作の結果をアクセサ120に返す。
S150:アクセサ120は、当該操作の結果をプログラミング・インタフェース110に返す。
S160:プログラミング・インタフェース110は、当該操作の結果をユーザ105に送信する。
このように、アクセサ120がオブジェクトの属性及び/又はプロパティを取得及び/又は設定することにより、ユーザ105は、様々な形態の属性及び/又はプロパティを有するオブジェクトを、共通したプログラミング・インタフェース110から利用し得る。同時に、ユーザ105は、共通したクラス130のメソッドを用いて同じクラスの様々なオブジェクトに対する操作を実施し得る。従って、図1に示すようなアクセサ120を通じてクラス130を利用するプログラミング・インタフェース110を用いることにより、ユーザ105は、属性及び/又はプロパティの形態が異なる様々なオブジェクトの操作において、オブジェクトごとに個別にコーディングする手間を省き、少ない手間で効率的にオブジェクト指向プログラムを開発することが可能になる。また、クラス130のメソッド呼び出しは、プログラミング・インタフェース110による設定に従って、任意の回数だけ実行され得るので、アクセサ120の動作を高速化することにより、ユーザ105から見た性能は向上し得る。
更に、本発明に係るアクセサを用いるプログラミング・インタフェースを説明するために、従来技術に係る方法の特徴を述べ、その後に従来技術と比較して本発明の方法を記載する。
従来技術に係る未知の型のオブジェクトを取り扱える仕組み、例えば、Java(登録商標)におけるBean機構等は、柔軟なソフトウェア開発環境を構成するために不可欠の仕組みである。具体的には、オブジェクトのシリアライズ/デシリアライズ(バイト列等への変換/この逆の復元)を行なうような機構では、未知のクラスのインスタンス・オブジェクトを生成し、未知のクラスのオブジェクトのメソッドの呼び出しやフィールドの値の取り出しと設定とを行なう必要がある。しかしながら、このような機構を実現するためには、従来技術においてはリフレクションと呼ばれる機構が使われ、その実行オーバーヘッドが大きいことが知られてきた。
従来技術に係るリフレクション機構は、Java(登録商標) Reflection API等の標準実装された特定のプログラミング・インタフェースを通じて動作するものであり、次のような特徴を有する。リフレクションは記述力が高く、比較的柔軟かつ汎用的なプログラムを作ることができる一方で、その実行速度が非常に遅いことが知られている。
(リフレクション−1)クラスに関するメタ情報をデータとして扱い得る。
(リフレクション−2)クラスやオブジェクトに対する汎用的操作を行い得る。
Java(登録商標)におけるBean機構においては、BeanInfoと呼ばれるAPIを通じてオブジェクトへの汎用的なアクセス手段が提供されている。一例において、ビーンのプロパティ(ゲッター/セッターメソッド呼び出し又はフィールドに直接読み書きすることでアクセス可能な仮想的なプロパティ)を全て合計してコンソールに表示するようなコードは、全プロパティがint型であることが既知であるならば、次式のように表される。
Figure 0005419033
従来技術に係る上述の式[I]において、
01行目は「変数objとして何らかのオブジェクトを受け取る」動作であり、
02行目は「objからクラスを変数beanClassとして得る」動作であり、
03行目は「beanClassからBeanInfoオブジェクトを変数beanInfoとして得る」動作であり、
04行目は、「beanInfoからPropertyDescriptorオブジェクトの配列を変数propsとして得る」動作であり、
05行目は「int型の変数sumを0で初期化する」動作であり、
06行目は「propsの各要素について」ループする動作であり、
07〜08行目は「getterメソッドのMethodオブジェクトを取り出し、そのinvokeメソッドを通して、objの各属性のgetterメソッドを呼び出す」動作であり、
09行目は「得られた結果をintValue()によりプリミティブ型のintに変換して、sumに足しこむ」動作であり、
11行目は「sumの値を表示する」動作であり得る。式[I]に示すアクセスの例は、07行目において、Reflection APIの一部であるMethodクラス(メソッドの情報や汎用アクセスを提供するクラス)のインスタンスを用いることにより、プロパティにアクセスしている。
Refleciton APIを用いた汎用的なコードの動作が遅い理由は、主に2つ挙げられる。第1の理由は、実装において汎用的に作らなければならないという都合であり得る。第2の理由は、パラメータ値や返り値等、プリミティブ型の値をObject型で扱えるようにラップ/アンラップする手間を要することであり得る。上の例では、Methodクラスのinvoke()メソッドの動作が遅いということが第1の理由に相当する。また、invoke()を呼び出すために、オブジェクト型の配列で引数を構成し、オブジェクト型で返り値を受けていることが第2の理由に相当する。
上記式[I]により表されるプログラムは典型的なBeanInfoの利用形態であるが、後に示す本発明と対比しやすくするため、上記のプログラムにおいてMethodオブジェクトの取得を早い段階で行うように工夫した変形例を、次式に示す。
Figure 0005419033
従来技術に係る上述の式[II]において、
01行目は、「変数objとして何らかのオブジェクトを受け取る」動作であり、
02行目は、「objからクラスを変数beanClassとして得る」動作であり、
03行目は、「beanClassからBeanInfoオブジェクトを変数beanInfoとして得る」動作であり、
04行目は、「beanInfoからPropertyDescriptorオブジェクトの配列を変数propsとして得る」動作であり、
05行目は、「propsと同じ大きさの配列をaccessorsとして作る」動作であり、
06〜07行目は、「各PropertyDescriptor要素のgetReadMethod()を呼び出しgetterメソッドのMethodオブジェクトを得て、accessorsの各要素とする」動作であり、
10行目は、「int型の変数sumを0で初期化する」動作であり、
11行目は、「accessorsの各要素のMethodオブジェクトごとに」ループする動作であり、
12行目は、「invokeメソッドを通して、objの各属性のgetterメソッドを呼び出す」動作であり、
13行目は、「得られた結果をintValue()によりプリミティブ型のintに変換して、sumに足しこむ」動作であり、
15行目は、「sumの値を表示する」動作であり得る。
従来技術に係る上述の式[II]の例においては、1つのオブジェクトにアクセスする場合を示すが、同じクラスの大量のオブジェクトに対してアクセスする必要がある場合には、繰り返し用いられ得る12〜13行目に相当する部分のオーバーヘッドが問題となる。第1のオーバーヘッドは、12行目のinvoke()として表されるMethodクラスの実装の限界によるオーバーヘッドであり、第2のオーバーヘッドは、利用しているコードにおいて、汎用的なオブジェクトを介してプリミティブ値にアクセスしなければならないオーバーヘッドである。具体的には、Objectクラスの配列として引数を受け取る場合、又は引数や返り値がint等のプリミティブ型である場合に、従来技術においては、それらをラップ/アンラップする必要が生じることによるオーバーヘッドを回避できなかった。また、従来技術に係るリフレクションAPIは汎用の用途を想定しており、どのように使われるかという情報を予め備えていないため、特有のアクセスに対する制御等の処理が追加され得る。このような制御が必要な場合には、リフレクションAPIは更に遅延を生じ得る。
図2は、従来技術に係る、アクセサの動作を表すフロー図である。図2に示す、未知のオブジェクトへのアクセス処理の流れ200は、アクセサを用いてオブジェクトを操作する利用側210に含まれるアプリケーションの動作、アクセサ側220の動作、及び対象のメソッド230の動作の諸段階を表すフロー図である。
従来技術に係る、未知のオブジェクトへのアクセス処理の流れ200は、次のような諸段階を含む。なお、以下の記載に用いる用語「実際のメソッド」は、具体的なメソッドを指す。
S250:利用側210のアプリケーション等は、引数を準備する。具体的には、引数として用いる値をラップし、引数の配列を作成する。
S252:invoke()を呼ぶ。
S260:操作されるオブジェクトに対するアクセス権をチェックする。このとき、適宜、アクセス権の無い場合の所定のエラー処理等を実施してもよい。
S262:実際のメソッドに渡すための引数を準備する。具体的には、引数の配列へのアクセス権を設定し、引数として用いる値をアンラップする。
S264:実際のメソッドを呼ぶ。
S270:実際のメソッドを実行する。
S280:返り値を受け取る。
S282:invoke()の返り値を準備する。具体的には、返り値をラップする。
S284:invoke()の結果を返す。
S290:返り値を受け取る。
S292:返り値を利用するための準備を行う。具体的には、返り値をアンラップする。
このような、図2に示す従来技術に係るアクセサの動作は、前述の従来技術に係る式[II]の12〜13行目における処理の流れ及びそのオーバーヘッドを含んでいる。具体的には、図2に示す諸段階の、S250及びS292からなる利用側210のアプリケーションにおけるオーバーヘッド、並びに、S260、S262及びS282からなるアクセサ側220におけるオーバーヘッドが挙げられる。
次いで、本発明に係るプログラミング・インタフェースについて説明する。
図3は、本発明の一実施形態に係る、アクセサの動作を表すフロー図である。図3に示す、発明を適用した場合のオブジェクトへのアクセスの処理の流れ300は、次のような諸段階を含む。
S300:利用側210のアプリケーション等は、本発明に係るアクセサ側220のinvoke()を呼ぶ。
S310:本発明に係る方法を含むアクセサ側220は、対象のメソッド230に対して、実際のメソッドを呼ぶ。
S320:実際のメソッドが実行される。
S330:本発明に係る方法を含むアクセサ側220は、対象のメソッド230から返り値を受け取る。
S332:本発明に係る方法を含むアクセサ側220は、利用側210のアプリケーション等に対してinvoke()の結果を返す。
S340:利用側210のアプリケーション等は返り値を受け取る。
更に、本発明に係るオブジェクトへのアクセス方法について説明する。一実施形態において、本発明に係る方法は、従来技術に係るリフレクション(Reflection APIとも呼称)とは独立した、オブジェクトへの汎用的なアクセス方法を定めたプログラミング・インタフェースを提供する。これにより、例えば本発明に係るランタイムを利用して、アクセス対象のオブジェクトのクラスに特化したプログラム・コードを記述することが可能になる。本発明の実施形態に係るプログラミング・インタフェースにおいては、特定のプロパティに特化したインタフェースを用い得る。本発明に係るライブラリにおいては、指定されたインタフェースを実装する特化したメソッドを実行時にコード生成することにより、プロパティへの高速なアクセスを可能にする。
一実施形態において、本発明に係る方法を用いることにより、前述の式[II]に示したアクセスの手順と同等のコードは、次式のように変更され得る。
Figure 0005419033
本発明の一実施形態に係る上述の式[III]において、
01行目は、「変数objとして何らかのオブジェクトを受け取る」動作であり、
02行目は、「objからクラス(Classオブジェクト)をbeanClassとして得る」動作であり、
03行目は、「beanClassから発明のgetPropertyAccessors()を通じてPropertyAccessorの配列をaccessorsとして得る」動作であり、
04行目は、「int型の変数sumを0で初期化する」動作であり、
06行目は、「accessorsの各要素について」ループする動作であり、
07行目は、「発明の、getIntValue()というint型のプロパティに特化して高速化されたアクセサを呼び出し、objの各属性のgetterメソッドを呼び出して属性の値をプリミティブ型の値として直接得て、それをsumに足しこむ」動作であり、
09行目は、「sumの値を表示する」動作であり得る。
本発明に係る上述の式[III]の07行目は、従来技術に係る式[II]の12〜13行目に相当する部分である。本発明に係る式[III]においては、この部分を実行することにより、図2に示した従来技術に係るS250及びS292、S260、並びに、S262及びS282からなるオーバーヘッドを回避し得る。すなわち、本発明に係る方法においては、利用したい型に特化したインタフェースを提供し、後述するコード生成により、当該インタフェースに特化したアクセス手段を備えたアクセサを生成することが可能である。これにより、本発明においては、従来技術によるオーバーヘッドを回避し得る。
より具体的には、本発明に係る上述の式[III]に例示するオブジェクトへのアクセス手順は、次のようなメソッドを備えることにより構成され得る。まず、03行目に含まれるBeanAccessorに続く静的(static)メソッドは、プロパティアクセサ・オブジェクトを生成するユーティリティ・メソッドであり、典型的には次式で表される。
Figure 0005419033
このメソッドは、プロパティ記述propにより指定されるプロパティへのアクセサ・オブジェクトを生成し得る。生成されるアクセサ・オブジェクトのクラスは、PropertyAccessorインタフェース(又はクラス)のサブクラスであり得る。
次いで、PropertyAccessorインタフェース(又はクラス)は、次の式[V]のようなメソッド、式[VI]のようなプリミティブ型のプロパティ用のゲッタメソッド、及び式[VII]のようなプリミティブ型のプロパティ用のセッターメソッドを備え得る。
Figure 0005419033
Figure 0005419033
Figure 0005419033
更に、これらのメソッドに対して、Filterインタフェースとして、次の式[VIII]のようなメソッドを用意してもよい。
Figure 0005419033
このように、図3に示す、発明を適用した場合のオブジェクトへのアクセスの処理の流れ300においては、上述の式[IV]〜[VIII]に例示したメソッド及び式[III]に例示したオブジェクトへのアクセス手順を用いることにより、従来技術とは異なってラップ/アンラップの動作を取り除くことが可能になる。具体的には、本発明に係る図3に示すアクセサの動作においては、従来技術に係るS250及びS292、S260、並びに、S262及びS282からなるオーバーヘッドを回避し得る。これにより、本発明に係る方法においては、型が未知のオブジェクトに対するアクセスを高速化することが可能になる。より具体的な、特定の型又はプロパティを有するオブジェクトに対するアクセスの高速化の例は、実施例を用いて後述する。
図4は、本発明の一実施形態に係る、オブジェクトにアクセスする手順を提供するライブラリの動作を表すフロー図である。
一実施形態において、図4に示すアクセサ・オブジェクトの生成400は、アクセサAPIメイン実装410、コード・ジェネレータ420、カスタム・クラス・ローダ430、及び特化アクセサ実装440を含む。アクセサAPIメイン実装410は、本発明に係るライブラリを利用してオブジェクトにアクセスしようとするアプリケーション等からの要求を受信し、並びに生成したアクセサ・オブジェクトをアプリケーション等に送信する。コード・ジェネレータ420は、特定の型又はプロパティを有するオブジェクトにアクセスするための、特化したアクセサ用のバイトコードを生成する。カスタム・クラス・ローダ430は、コード・ジェネレータ420により生成されたバイトコードを実装するためにクラス・オブジェクトを生成する。特化アクセサ実装440は、カスタム・クラス・ローダ430により生成されたクラス・オブジェクトを用いてバイトコードを実装した状態であり、この特化アクセサ実装440に対して、アクセサAPIメイン実装410がアプリケーション等から受信した要求に含まれる情報を入力することにより、当該情報に対応するアクセサからの返り値が出力される。
図4に示す、アクセサ・オブジェクトの生成400の動作は、次のような諸段階を含む。
S450:オブジェクトにアクセスしようとするアプリケーション等は、アクセサに対する要求を送信する。
S460:アクセサAPIメイン実装410は、当該要求に基づくバイトコードを生成するよう、コード・ジェネレータ420に指示を送信する。
S462:コード・ジェネレータ420は、生成したバイトコードをアクセサAPIメイン実装410に送信する。
S470:アクセサAPIメイン実装410は、生成されたバイトコードを実装するためのクラス・オブジェクトを生成するよう、カスタム・クラス・ローダ430に指示を送信する。
S472:カスタム・クラス・ローダ430は、生成したクラス・オブジェクトをアクセサAPIメイン実装410に送信する。
S474:カスタム・クラス・ローダ430は、生成したクラス・オブジェクトを実装するよう、特化アクセサ実装440にロード命令を送信する。
S480:アクセサAPIメイン実装410は、特化アクセサ実装440に新規インスタンスを送信する。具体的には、この新規インスタンスは、アクセサAPIメイン実装410がアプリケーション等から受信した要求に含まれる情報であり得る。
S482:特化アクセサ実装440は、アクセサAPIメイン実装410にアクセサ・オブジェクトを戻り値として送信する。
S490:アクセサAPIメイン実装410は、オブジェクトにアクセスしようとするアプリケーション等にアクセサ・オブジェクトを戻り値として送信する。
例えば、前述のgetPropertyAccessor()等のメソッドが呼ばれると、本発明に係るライブラリは、当該ライブラリを利用するアプリケーション等による所与のパラメータに基づき、コード・ジェネレータ420を用いて特化したアクセサ用のコードを生成し、カスタム・クラス・ローダ430を用いて生成されたクラスのバイトコードをロードし、ロードしたクラスのインスタンスを特化アクセサ実装440として生成し得る。
これらの、本発明に係るアクセサ・オブジェクトの生成400における、バイトコードの生成を含む処理の流れについて、更に詳しく説明する。
図5は、本発明の一実施形態に係る、バイトコード生成の手順を示すフロー図である。図5に示す、バイトコード生成の処理の流れ500は、上述の図4に示したアクセサ・オブジェクトの生成400に含まれるコード・ジェネレータ420及びカスタム・クラス・ローダ430の動作であり得る。図5(a)はアクセサ・クラスを生成する手順、図5(b)は参照型用のアクセサ・クラスを生成する手順、図5(c)はプリミティブ型用のアクセサ・クラスを生成する手順を、それぞれ表している。
図5(a)に示すアクセサ・クラスを生成する手順において、本発明の一実施形態に係るコード・ジェネレータ420は、次のように動作し得る。
S510:アクセス対象のプロパティの型を調べる。
S520:プロパティの型が参照型であるか、プリミティブ型であるかを判定する。参照型であればS530に進み、プリミティブ型であればS540に進む。
S530:参照型用のアクセサ・クラスを生成する。
S540:プリミティブ型用のアクセサ・クラスを生成する。
図5(b)に示す参照型用のアクセサ・クラスを生成するステップS530において、カスタム・クラス・ローダ430は、次のように動作し得る。
S532:参照型用のget(Object)を生成する。
S534:参照型用のset(get(Object))を生成する。
S536:参照型用のコピーのためのメソッドを生成する。
図5(c)に示すプリミティブ型用のアクセサ・クラスを生成するステップS540において、カスタム・クラス・ローダ430は、次のように動作し得る。
S542:プリミティブ型用のget(Object)を生成する。
S544:プリミティブ型用のget(Object,Object)を生成する。
S546:プロパティの型用のgetXXValue(Object)を生成する。
S548:プロパティの型用のsetXXValue(Object,xx)を生成する。
S549:プリミティブ型用のコピーのためのメソッドを生成する。
このように、本発明の一実施形態に係るコード・ジェネレータ420の動作により、プロパティの型の差異に基づいてアクセサ・クラスが用意され得る。更に、本発明の一実施形態に係るカスタム・クラス・ローダ430の動作により、異なるプロパティの型の数だけ独立してget/setメソッド及びコピーのためのメソッドが用意され得る。従って、これらのメソッドごとに、異なるプロパティの型の数だけ独立して戻り値の型が用意され、異なるプロパティの型の数だけ独立して引数が用意され得る。
図5(b)のS536、及び図5(c)のS549は、それぞれ式[VIII]に例示したフィルタ・オブジェクト等を適宜引数として、オブジェクトのプロパティをコピー(当技術分野に公知の「浅いコピー」)するためのメソッドであってもよく、更にこれに加えて参照先のインスタンスを複製する動作(当技術分野に公知の「深いコピー」)を実施してもよい。
図6は、上述の図5(b)に示した参照型用のメソッドを生成する手順を示すフロー図である。図6(a)に示す参照型用のget(Object)を生成するステップS532において、本発明に係るカスタム・クラス・ローダ430は、次のように動作し得る。
S602:対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
S604:読み出しメソッドを呼ぶコードを生成する。
S606:呼び出した結果を返すコードを生成する。
また、図6(b)に示す参照型用のset(Object,Object)を生成するステップS534において、本発明に係るカスタム・クラス・ローダ430は、次のように動作し得る。
S612:対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
S614:設定値オブジェクトをプロパティの型にキャストするコードを生成する。
S616:書き込みメソッドを呼ぶコードを生成する。
図7は、上述の図5(c)に示したプリミティブ型用のメソッドを生成する手順を示すフロー図である。図7(a)に示す、プリミティブ型用のget(Object)を生成するステップS546において、本発明に係るカスタム・クラス・ローダ430は、次のように動作し得る。
S652:対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
S654:読み出しメソッドを呼ぶコードを生成する。
S656:呼び出した結果を返すコードを生成する。
また、図7(b)に示す、プロパティの型用のsetXXValue(Object,xx)を生成するステップS548において、本発明に係るカスタム・クラス・ローダ430は、次のように動作し得る。
S662:対象オブジェクトをアクセス対象クラスにキャストするコードを生成する。
S664:書き込みメソッドを呼ぶコードを生成する。
図6及び図7を用いて示すコード生成は、参照型(プリミティブ型でない)のプロパティの場合、次式のようなテンプレートを埋めることによって行なわれてもよい。ただし、PropertyAccessorの備えるメソッドは全て、実行時エラーを知らせる既定の実装が与えられている。生成されるアクセサ・クラスは、それらの一部を上書きして利用できるようにする。
Figure 0005419033
本発明の一実施形態に係る上述の式[IX]において、
01行目は、「テンプレート・パラメータ${accessor class}で表される名前のクラスをPropertyAccessorクラスのサブクラスとして宣言する」動作であり、
02行目は、「汎用型のターゲットをパラメータtargetにとり、汎用型の結果を返すメソッドget()を宣言する」動作であり、
03行目は、「テンプレート・パラメータ${bean class}にtargetをキャストし、テンプレート・パラメータ${getter method}という名前のメソッドを呼び出して返す」動作であり、
05行目は、「汎用型のターゲットをパラメータtargetにとり、汎用型の設定値をパラメータvalueにとるメソッドset()を宣言する」動作であり、
06行目は、「テンプレート・パラメータ${bean class}にtargetをキャストし、テンプレート・パラメータ${property type}にvalueをキャストしたものを引数としてテンプレート・パラメータ${setter method}という名前のメソッドを呼び出す」動作であり、
08〜09行目は、「上記で定義されたget()とset()を使って2つのオブジェクトの同属性の値を一方から他方へコピーするメソッドを宣言する」動作であり、
12〜13行目は、「上記で定義されたget()とset()を使って2つのオブジェクトの同属性の値を一方から他方へ、フィルタをかけたものを設定するメソッドを宣言する」動作であり得る。
また、プリミティブ型のプロパティの場合は、次式のようなテンプレートを埋めることによってコードが生成され得る。
Figure 0005419033
式中、Integer等の特定の型を表す部分は必要に応じて変化し得る。
本発明の一実施形態に係る上述の式[X]において、
01行目は、「テンプレート・パラメータ${accessor class}で表される名前のクラスをPropertyAccessorクラスのサブクラスとして宣言する」動作であり、
02行目は、「汎用型のターゲットをパラメータtargetにとり、汎用型の結果を返すメソッドget()を宣言する」動作であり、
03行目は、「後に定義するgetIntValue()を使ってtargetにアクセスし、返り値をIntegerオブジェクトでラップして返す」動作であり、
05行目は、「汎用型のターゲットをパラメータtargetにとり、汎用型の設定値をパラメータvalueにとるメソッドset()を宣言する」動作であり、
06行目は、「valueをInteger型にキャストして、プリミティブ型の整数値を取り出すメソッドintValue()を呼び出し、結果を、後に定義するsetIntValue()を使ってtargetにアクセスして設定する」動作であり、
08行目は、「汎用型のターゲットをパラメータtargetにとり、プリミティブ型に特化してintの結果を返すメソッドgetIntValue()を宣言する」動作であり、
09行目は、「テンプレート・パラメータ${bean class}にtargetをキャストし、テンプレート・パラメータ${getter method}という名前のメソッドを呼び出して返す」動作であり、
11行目は、「汎用型のターゲットをパラメータtargetにとり、プリミティブ型に特化してintの設定値をパラメータvalueにとるメソッドset()を宣言する」動作であり、
12行目は、「テンプレート・パラメータ${bean class}にtargetをキャストし、valueを引数としてテンプレート・パラメータ${setter method}という名前のメソッドを呼び出す」動作であり、
14行目は、「上記で定義されたgetIntValue()とsetIntValue()を使って2つのオブジェクトの同属性の値を、一方から他方へコピーするメソッドを宣言する」動作であり、
17行目は、「上記で定義されたgetIntValue()とsetIntValue()を使って2つのオブジェクトの同属性の値を一方から他方へ、フィルタをかけたものを設定するメソッドを宣言する」動作であり得る。
上述の説明においてはソースコード表記を例示したが、別の実施形態においてソースコードで埋めてコンパイルしてもよく、更に別の実施形態においてバイトコードレベルのテンプレートを埋めてもよい。ソースコードレベルで行なう場合は、文字列の連結でファイルを生成して通常のJava(登録商標)コンパイラにかければ必要なバイトコードが得られる。バイトコードレベルで行なう場合は、自前でバイトコードを生成してもよいが、BCELやJavassistのようなバイトコード編集ライブラリを用いて実装することもできる。
(バイトコードのテンプレートの例)
次式に、バイトコードのテンプレートの例を示す。通常のJava(登録商標)バイトコードのフォーマットに従って、前半にコンスタントプール、後半にメソッド定義を含む形式を用いる。「//」以降はコメントであり、実際のバイトコード(テンプレート)には反映されない。コンスタントプールの16、18、21、23〜26の項目の文字列定数がパラメータ化されている。なお、用語「実際のバイトコード」は、具体的なバイトコードを指す。
Figure 0005419033
(プログラミング・インタフェースを用いる応用)
次式に、BeanAccessorのユーティリティ・メソッドとして、所与のクラスから、PropertyAccessorクラスのプロパティアクセサ・オブジェクトをプロパティ分だけ生成する例を示す。
Figure 0005419033
本発明の一実施形態に係る上述の式[XII]において、
01行目は、「クラス(Classオブジェクト)を引数にとりPropertyAccessorの配列を返すメソッドgetPropertyAccessorsを宣言する」動作であり、
02行目は、「従来のBeanのライブラリIntrospectorのgetBenaInfoを通じて、BeanInfoオブジェクトを取得する」動作であり、
03行目は、「従来のライブラリを用いて、プロパティ記述である、PropertyDescriptorを取得する」動作であり、
04行目は、「発明のPropertyAccessorの配列をPropertyDescriptorの配列と同じ大きさで生成する」動作であり、
05行目は、「各PropertyDescriptorから、発明のgetPropertyAccessorを使ってPropertyAccessorを取得し、PropertyAccessorの配列の各要素とする」動作であり、
09行目は、「生成して設定したPropertyAccessorの配列を返す」動作であり得る。
(インヴォーカを利用するプログラミング・インタフェースの例)
本発明に係る方法は、インヴォーカ・オブジェクトを生成するユーティリティ・メソッドとして、次式のように利用されるBeanAccessorのstaticメソッドgetMethodInvoker()を含み得る。
Figure 0005419033
本発明の一実施形態に係る上述の式[XIII]において、
01行目は、「変数objとして何らかのオブジェクトを受け取る」動作であり、
02行目は、「objからクラス(Classオブジェクト)をbeanClassとして得る」動作であり、
03行目は、「beanClassから何らかのMethodオブジェクトを得る」動作であり、
04行目は、「既知のクラスAppFaceの既知のメソッドinvoke()のMethodオブジェクトを得る」動作であり、
05行目は、「発明のgetMethodInvoker()により、knownMethodを通じてtargetMethodを高速に呼び出すように生成されたクラスのインスタンス・オブジェクトをinvoker変数として得る」動作であり、
06行目は、「invoker変数の既知のメソッドinvoke()に対し、未知の対象オブジェクト(obj)に加え、既知の型のパラメータ列である文字列(“Hello”)と整数値(2)の3つのパラメータを渡して呼び出す」動作であり得る。
ただし、式中、AppFaceは既知のインタフェースであり、次のようになっているとする。
Figure 0005419033
AppFaceはユーザにより与えられるインタフェースであり、その形態は限定しないが、未知の呼び出し対象メソッド(変数targetMethodで指されている)に適合するメソッド(この場合invoke()で、変数knownMethodで指されている)を備えたものである必要がある。簡単には、呼び出し対象メソッドの引数(この場合、invoke()の messageとcountに相当する引数)に任意のオブジェクト(例ではinvoke()のtarget引数)を受け取れる引数を追加したものとなる。好ましくは、より柔軟な対応関係決定方針をユーザが与えられるようにしてもよい。
生成されるオブジェクトのクラスは、プロパティの場合と同様に、対象メソッドに特化したコードを実装したものとなる。ただし、そのインタフェースは、プロパティの場合とは異なり、指定されたもの(この場合AppFace)となる。
Figure 0005419033
本発明の一実施形態に係る上述の式[XV]において、
01行目は、「テンプレート・パラメータ${invoker class}で表される名前のクラスをテンプレート・パラメータ${invoker face}で表されるインタフェースを実装するクラスとして宣言(例の場合においてはAppFaceを実装)する」動作であり、
02行目は、「テンプレート・パラメータ${return type} (targetの型)型の結果を返し、汎用型のターゲットをパラメータtargetに加え、target(のあるメソッド)に特化した特定の引数(AppFace)とり、テンプレート・パラメータ${invoker name}(既知のメソッドの名前)を名前にもつメソッドを宣言する」動作であり、
03行目は、「コード生成時にわかるターゲットの型であるテンプレート・パラメータ${target type}にtargetをキャストして、target以外の残りの引数をそのまま渡し、コード生成時にわかるターゲットのメソッド名である${target method}をメソッド名としてメソッドを呼び出し、返り値をそのまま返す」動作であり得る。
[プログラミング装置のハードウェア構成]
図8は、本実施形態に係る、プログラミング装置のハードウェア構成を示す図である。図8においては、プログラミング装置を情報処理装置1000とし、そのハードウェア構成を例示する。以下は、コンピュータを典型とする情報処理装置として全般的な構成を説明するが、その環境に応じて必要最小限な構成を選択できることはいうまでもない。
情報処理装置1000は、CPU(Central Processing Unit)1010、バスライン1005、通信I/F1040、メインメモリ1050、BIOS(Basic Input Output System)1060、パラレルポート1080、USBポート1090、グラフィック・コントローラ1020、VRAM1024、音声プロセッサ1030、I/Oコントローラ1070、並びにキーボード及びマウス・アダプタ1100等の入力手段を備える。I/Oコントローラ1070には、フレキシブル・ディスク(FD)ドライブ1072、ハードディスク1074、光ディスク・ドライブ1076、半導体メモリ1078等の記憶手段を接続することができる。メインメモリ1050は、例えばダイナミック・ランダムアクセス・メモリ等の任意のメモリ・デバイスを用いて構成される。
音声プロセッサ1030には、マイクロホン1036、増幅回路1032、及びスピーカ1034が接続される。また、グラフィック・コントローラ1020には、表示装置1022が接続されている。
BIOS1060は、情報処理装置1000の起動時にCPU1010が実行するブートプログラムや、情報処理装置1000のハードウェアに依存するプログラム等を格納する。FD(フレキシブル・ディスク)ドライブ1072は、フレキシブル・ディスク1071からプログラム又はデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050又はハードディスク1074に提供する。図8には、情報処理装置1000の内部にハードディスク1074が含まれる例を示したが、バスライン1005又はI/Oコントローラ1070に外部機器接続用インタフェース(図示せず)を接続し、情報処理装置1000の外部にハードディスクを接続又は増設してもよい。
光ディスク・ドライブ1076としては、例えば、DVD−ROMドライブ、CD−ROMドライブ、DVD−RAMドライブ、BD(Blu−ray Disk)−ROMドライブ等を使用することができる。この際は各ドライブに対応した光ディスク1077を使用する必要がある。光ディスク・ドライブ1076は光ディスク1077からプログラム又はデータを読み取り、I/Oコントローラ1070を介してメインメモリ1050又はハードディスク1074に提供することもできる。
情報処理装置1000に提供されるコンピュータ・プログラムは、フレキシブル・ディスク1071、光ディスク1077、又はメモリカード等の記録媒体に格納されて利用者によって提供される。このコンピュータ・プログラムは、I/Oコントローラ1070を介して、記録媒体から読み出され、又は通信I/F1040を介してダウンロードされることによって、情報処理装置1000にインストールされ実行される。コンピュータ・プログラムが情報処理装置に働きかけて行わせる動作は、既に説明した装置における動作と同一であるので省略する。
前述のコンピュータ・プログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としてはフレキシブル・ディスク1071、光ディスク1077、又はメモリカードの他に、MD等の光磁気記録媒体、テープ媒体を用いることができる。また、専用通信回線やインターネットに接続されたサーバシステムに設けたハードディスク又は光ディスク・ライブラリ等の記憶装置を記録媒体として使用し、通信回線を介してコンピュータ・プログラムを情報処理装置1000に提供してもよい。
以上の例は、情報処理装置1000について主に説明したが、コンピュータに、情報処理装置で説明した機能を有するプログラムをインストールして、そのコンピュータを情報処理装置として動作させることにより上記で説明した情報処理装置と同様な機能を実現することができる。
本装置は、ハードウェア、ソフトウェア、又はハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアの組み合わせによる実施では、所定のプログラムを有するコンピュータ・システムでの実施が典型的な例として挙げられる。係る場合、該所定のプログラムが該コンピュータ・システムにロードされ実行されることにより、該プログラムは、コンピュータ・システムに本発明に係る処理を実行させる。このプログラムは、任意の言語、コード、又は表記によって表現可能な命令群から構成される。そのような命令群は、システムが特定の機能を直接実行すること、又は(1)他の言語、コード、もしくは表記への変換、(2)他の媒体への複製、のいずれか一方もしくは双方が行われた後に、実行することを可能にするものである。もちろん、本発明は、そのようなプログラム自体のみならず、プログラムを記録した媒体を含むプログラム製品もその範囲に含むものである。本発明の機能を実行するためのプログラムは、フレキシブル・ディスク、MO、CD−ROM、DVD、ハードディスク装置、ROM、RAM、フラッシュメモリ等の任意のコンピュータ可読媒体に格納することができる。係るプログラムは、コンピュータ可読媒体への格納のために、通信回線で接続する他のコンピュータ・システムからダウンロードしたり、他の媒体から複製したりすることができる。また、係るプログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。
(実施例1:バイトコードの生成例)
本発明に係る方法の実施例として、所与のクラスに基づいてバイトコードを生成する例を示す。次のような、クラスBankInfoがランタイムに与えられたとする。
Figure 0005419033
本発明に係るライブラリに含まれるBeanAccessor.getPropertyAccessors()、又はBeanAccessor.getPropertyAccessor()等により、このクラスのオブジェクトへ高速にアクセスするためのコードが生成され得る。具体的には、BankInfoのプロパティのうち、String型のプロパティbranchに対して、本発明のライブラリは、例えば、次式に相当するバイトコードを生成することが可能である。
Figure 0005419033
また、BankInfoのプロパティのうち、int型のプロパティidに対して、本発明のライブラリは、次に相当するバイトコードを生成し得る。
Figure 0005419033
(実施例2:バイトコードのコンスタントプール部分の例)
次の式[XIX]に例示するアクセス対象クラスに対して、本発明により、前述の式[X]に示したテンプレートから生成されるバイトコードのコンスタントプール部分の一部を、式[XX]に例示する。
Figure 0005419033
Figure 0005419033
(実施例3:オブジェクトへのアクセスの高速化の例)
本発明に係る方法を用いてオブジェクトにアクセスすることにより、未知のクラスのオブジェクトに対して汎用的かつ高速なアクセスが可能になる。表1は、オブジェクトのディープコピーを様々な方法で実装したものの実行時間を比較したものである。実行環境としては、ランタイムとして「Sun Java 2 Runtime Environment, Standard Edition, version 1.4.2 HotSpot Server VM」を、オペレーティングシステムとして「Linux(登録商標) 2.4.18−14」を、ハードウェアとして「IBM intelliStation M Pro,a single Pentium(登録商標) 4 Processor 2.4GHz, 2GB memory」をそれぞれ用いた。表1のコピーコードとして区別される項目において、Hand−writtenは手で最善と思われるコピーを実装したもの、Generated source codeは、本発明と同等のコードをソースコードとして生成してコンパイルしたもの、Generated bytecodeが本発明によるもの、Reflectionは従来技術に係るリフレクション(Reflection API)を用いたものである。本発明により生成されたバイトコードと、従来技術に係るリフレクションを用いたものとでは数十倍の差が生じ、本発明の方法によりオブジェクト操作の高速化を達成することが可能であった。
Figure 0005419033
また、本発明では、コード生成される部分が、鍵となる小さな部分に限られているため、本発明のAPIを用いた汎用プログラムの保守性、特にデバッガを用いたデバッグのしやすさは、全てを実行時にコード生成する場合に比べ、リフレクションを用いた汎用プログラム程度に、良好になり得る。コード生成のコストも小さくなることが期待できる。
(実施例4:シリアライザへの実装の例)
更に、本発明は、例えば次式に示すようなシリアライザに実装することが可能であり、現実的なアプリケーションとして利用し得る。
Figure 0005419033
本発明の実装例に係る式[XXI]において、
01行目は、「シリアライザを実装したクラスMySerializer全体を宣言する」動作であり、
02行目は、「シリアライズ対象のオブジェクトのクラスを表すクラス・オブジェクトを保持しておく、Class型のフィールドtargetClassを宣言する」動作であり、
03行目は、「シリアライズ対象のオブジェクトの各プロパティへのアクセサ・オブジェクト(PropertyAccessor型)をキャッシュしておく、PropertyAccessorの配列型のフィールドpropsを宣言する」動作であり、
04行目は、「シリアライズ対象のオブジェクトの各プロパティの型を表すクラス・オブジェクト(Class型)をキャッシュしておく、Classの配列型のフィールドtypesを宣言する」動作であり、
05行目は、「MySerializerオブジェクトのコンストラクタ・シリアライズ対象のクラスの設定(targetClass)の後、前述の本発明に係る式[III]と同様にアクセサをキャッシュ(props)することに加え、各プロパティの型のキャッシュ(types)を初期化する」動作であり、
20行目は、「シリアライズの処理を行うメソッドserializeInto()を宣言し、シリアライズ結果出力先outと、シリアライズ対象のオブジェクトobjを引数とする」動作であり、
21行目は、「シリアライズ対象のオブジェクトが初期化時に設定されたクラスのときのみ処理を行う(22−30)が、そうでなければ、例外をあげる(32)」動作であり、
22行目は、「各アクセサについて以下の処理を行う」動作であり、
23行目は、「プロパティの型がintであれば、objに対して、intに特化したアクセス・メソッドgetIntValue()を呼び出してプロパティの値を取り出し、整数値を書き出すためのメソッドwriteInt()をoutに対して呼ぶ」動作であり、
25行目は、「プロパティの型がdoubleであれば、objに対して、doubleに特化したアクセス・メソッドgetDoubleValue()を呼び出してプロパティの値を取り出し、小数値を書き出すためのメソッドwriteDouble()をoutに対して呼ぶ」動作であり、
27行目は、「プロパティの型がStringであれば、objに対して、汎用的なアクセス・メソッドget()を呼び出してプロパティの値を取り出し、String型にキャストした上で文字列を書き出すためのメソッドwriteUTF()をoutに対して呼ぶ」動作であり得る。
このような実装の例においては、メソッドserializeInto()が実行時に何度も呼ばれることになるが、少なくとも実行オーバーヘッドとなり得るReflection APIを利用することなく、シリアライザを実現することが可能である。
(実施例5:クラスの例)
本発明に係る方法において、例えばカスタム・クラス・ローダ430が生成するクラスには、PropertyAccessorクラスとして、次の式を用い得る。
Figure 0005419033
(実施例6:コード生成プログラムの例)
本発明に係るオブジェクトのアクセス方法は、例えば、バイトコード編集ライブラリJavassistを用いて、次式のように実装してもよい。
Figure 0005419033
以上、本発明を実施形態に則して説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態又は実施例に記載されたものに限定されるものではない。
本発明の一実施形態に係る、アクセサ120の概略を表す説明図である。 従来技術に係る、アクセサの動作を表すフロー図である。 本発明の一実施形態に係る、アクセサの動作を表すフロー図である。 本発明の一実施形態に係る、オブジェクトにアクセスする手順を提供するライブラリの動作を表すフロー図である。 本発明の一実施形態に係る、バイトコード生成の手順を示すフロー図である。 本発明の一実施形態に係る、参照型用のメソッドを生成する手順を示すフロー図である。 本発明の一実施形態に係る、プリミティブ型用のメソッドを生成する手順を示すフロー図である。 本発明の一実施形態に係る、プログラミング装置のハードウェア構成を示す図である。
符号の説明
105 ユーザ
110 プログラミング・インタフェース
120 アクセサ
130 クラス
210 利用側
220 アクセサ側
230 対象のメソッド
300 本発明を適用した場合のオブジェクトへのアクセスの処理の流れ
400 アクセサ・オブジェクトの生成
410 アクセサAPIメイン実装
420 コード・ジェネレータ
430 カスタム・クラス・ローダ
440 特化アクセサ実装
500 バイトコード生成の処理の流れ
600 参照型プロパティへのアクセス用コード生成の処理の流れ
650 プリミティブ型プロパティへのアクセス用コード生成の処理の流れ
1000 情報処理装置

Claims (7)

  1. アプリケーション・プログラムから未知であったクラスを利用するためにメモリ・デバイス中にライブラリを実行時に作成する方法であって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
    アクセスされるオブジェクトを引数とするメソッドを用意するステップと、
    前記アクセスされるオブジェクトが有するメソッド情報と、既知のインタフェースのメソッド情報とに基づいて、前記アクセスされるオブジェクトが有するメソッドを、前記既知のインタフェースを通じて行えるようにするインヴォーカ・オブジェクトを返すステップと、を含み、
    前記インヴォーカ・オブジェクトによるメソッド呼び出しメソッドは、前記アクセスされるオブジェクトを引数とする、
    ライブラリを作成する方法。
  2. 前記アプリケーション・プログラムが前記オブジェクトにアクセスすることに応答して、前記アクセスされるオブジェクトを引数とするメソッドを用意するステップは、前記メソッドに基づくコードを生成する、
    請求項に記載のライブラリを作成する方法。
  3. 前記メソッドに基づく前記コードは、予め用意したテンプレートに基づくバイトコードである、
    請求項に記載のライブラリを作成する方法。
  4. 前記アプリケーション・プログラムが前記オブジェクトにアクセスすることに応答して、前記アクセスされるオブジェクトを引数とするメソッドを用意するステップは、前記メソッドに基づくコードを生成する、
    請求項1に記載のライブラリを作成する方法。
  5. 前記メソッドに基づく前記コードは、予め用意したテンプレートに基づくバイトコードである、請求項に記載のライブラリを作成する方法。
  6. 請求項1からのいずれか1項に記載の方法の各ステップをコンピュータに実行させるためのコンピュータ・プログラム。
  7. アプリケーション・プログラムから未知であったクラスを利用するためにコンピュータ可読媒体中にライブラリを実行時に作成するシステムであって、前記アプリケーション・プログラムがオブジェクトにアクセスするときに、
    アクセスされるオブジェクトを引数とするメソッドを用意する手段と、
    前記アクセスされるオブジェクトが有するメソッド情報と、既知のインタフェースのメソッド情報とに基づいて、前記アクセスされるオブジェクトが有するメソッドを、前記既知のインタフェースを通じて行えるようにするインヴォーカ・オブジェクトを返す手段と、を含み、
    前記インヴォーカ・オブジェクトによるメソッド呼び出しメソッドは、前記アクセスされるオブジェクトを引数とする、
    ライブラリを作成するシステム。
JP2008298346A 2008-11-21 2008-11-21 未知のオブジェクトにアクセスする方法 Expired - Fee Related JP5419033B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008298346A JP5419033B2 (ja) 2008-11-21 2008-11-21 未知のオブジェクトにアクセスする方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008298346A JP5419033B2 (ja) 2008-11-21 2008-11-21 未知のオブジェクトにアクセスする方法

Publications (2)

Publication Number Publication Date
JP2010123060A JP2010123060A (ja) 2010-06-03
JP5419033B2 true JP5419033B2 (ja) 2014-02-19

Family

ID=42324327

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008298346A Expired - Fee Related JP5419033B2 (ja) 2008-11-21 2008-11-21 未知のオブジェクトにアクセスする方法

Country Status (1)

Country Link
JP (1) JP5419033B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5425715B2 (ja) 2010-06-03 2014-02-26 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム実行方法、システム及びプログラム
JP5673246B2 (ja) * 2011-03-14 2015-02-18 富士通株式会社 データストア制御装置、データストア制御プログラムおよびデータストア制御方法
US8782620B2 (en) 2012-06-12 2014-07-15 International Business Machines Corporation Processing reified generics in object-based programming environments
CN111913814B (zh) * 2020-07-09 2024-05-31 海南车智易通信息技术有限公司 对象拷贝方法及计算设备
CN116719531B (zh) * 2023-06-14 2024-11-26 欧冶工业品股份有限公司 基于运行时字节码编辑的对象转换方法、系统、介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005250958A (ja) * 2004-03-05 2005-09-15 Ntt Data Corp 分散コンピューティング環境におけるサービス実行処理システム、およびそのクライアント装置ならびにプログラム、サービス実行処理方法

Also Published As

Publication number Publication date
JP2010123060A (ja) 2010-06-03

Similar Documents

Publication Publication Date Title
JP7324831B2 (ja) ディープラーニングフレームワークにおける演算子の展開方法、展開装置及び電子機器
JP5679989B2 (ja) デバッグパイプライン
Team R internals
JP5415557B2 (ja) デバッギングのためのユーザ・スクリプト・コードの変換
CN1181428C (zh) 软件翻译的内省编辑器系统、程序和方法
US10437574B2 (en) System and method for providing code completion features for code modules
JP5933002B2 (ja) ランタイムシステム
US11366643B2 (en) Generating dynamic modular proxies
US10140119B2 (en) Modular serialization
US20250199785A1 (en) Compilation methods, compilers, and wasm virtual machines
US20060225053A1 (en) Programming language improvements
EP1552385A1 (en) Providing dynamic model-code associativity
JP2005135384A (ja) コンピュータプラットフォームのためのプログラミングインターフェース
US8650532B2 (en) Change notification and information update based on uncompiled software development project
US9038033B1 (en) Techniques and mechanisms for web application minification
US20050114871A1 (en) System for optimizing application start-up
JP5419033B2 (ja) 未知のオブジェクトにアクセスする方法
US8201143B2 (en) Dynamic mating of a modified user interface with pre-modified user interface code library
WO2019090994A1 (zh) 测试脚本自动化执行方法、装置、设备以及存储介质
US20090320007A1 (en) Local metadata for external components
JP2011065220A (ja) コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム
Van den Brand et al. Generator of efficient strongly typed abstract syntax trees in Java
JP2018156133A (ja) コンパイラプログラム、情報処理装置およびコンパイル方法
US8141034B2 (en) System for automating the definition of application objects supporting compressing operations
US20080222627A1 (en) Static extensibility models with dynamic languages and scripts

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110908

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20121204

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130304

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130813

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130930

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20131022

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20131023

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131112

LAPS Cancellation because of no payment of annual fees