モジュール java.corba

パッケージ org.omg.DynamicAny

実行時にanyに関連付けられたデータ値のトラバース、およびデータ値の基本的な構成要素の抽出を可能にするクラスとインタフェースを提供します。

anyは、そのanyの型について静的な情報がない(IDLコンパイラがその型について生成したコードが、オブジェクト実装を含めてコンパイルされていない)プログラムに渡すことができます。 このため、オブジェクトはanyを受け取っても、それを使用するための移植性のあるメソッドがないことになります。

DynAnyを使うと、anyのデータ値のトラバースを実行時に行い、データ値の基本的な構成要素を抽出できます。 これは、強力なジェネリック・サーバー(ブリッジ、フィルタリングをサポートするイベント・チャネル)を作成する場合に役立ちます。 また、型に関する静的な情報を持たずに、実行時にanyを構築することもできます。 これは、ジェネリック・クライアント(ブリッジ、ブラウザ、デバッガ、ユーザー・インタフェース・ツール)を作成する場合に役立ちます。

Anyの値は、DynAnyオブジェクトを通して動的に解釈(トラバース)および構築できます。 DynAnyオブジェクトはデータ値に関連付けられますが、このデータ値はAnyに挿入された値のコピーに対応します。 DynAnyオブジェクトは、コンポーネントのDynAnyの順序付けられたコレクションとみなすことができます。 DynAnylongなどの基本型を表す場合、または空の例外のようにコンポーネントのない型を表す場合は、コンポーネントの順序付けられたコレクションは空になります。

それぞれのDynAnyオブジェクトで、そのDynAnyのコンポーネントのコレクション内における現在位置が把握されます。 現在位置は、0からn-1のインデックス値で示されます(nはコンポーネントの数)。 -1という特別なインデックス値もあり、これは現在位置がどこも指し示していないことを意味します。 現在位置を持つことのできない値(空の例外など)の場合、インデックス値は -1で固定されます。 DynAnyがコンポーネントを持つ値で初期化された場合、インデックスも0に初期化されます。 初期化されていないDynAny (DynAnyに値がないが、コンポーネントを持つことのできるTypeCodeがある)が作成された場合は、現在位置はDynAnyによって表される値の型によって異なります。 現在位置は、新規作成されたDynAnyのコンポーネントがデフォルト値を持てるかどうかによって0または -1になります。

rewindseekおよびnextの繰返し操作を使用すると、現在位置が変更できます。current_component操作は、現在位置のコンポーネントを返します。 component_count操作はDynAnyのコンポーネントの数を返します。 これらの操作をあわせて使用すると、コンポーネントの内容を(再帰的に)調べるなど、DynAnyのコンポーネントに対して反復処理を行えます。

構築型と関連付けられたDynAnyオブジェクトを、構築型DynAnyオブジェクトと呼びます。 IDLの各種構築型(fixed、enum、struct、sequence、union、array、exception、値型)のそれぞれについて、DynAnyインタフェースから継承されたインタフェースがあります。 構築型DynAnyオブジェクトは、DynAnyオブジェクトを新規作成するための操作をエクスポートします。作成されるオブジェクトはそれぞれ構築型のデータ値のコンポーネントに関連付けられます。 たとえば、DynStructstruct値と関連付けられます。 つまり、DynStructは、構造体のメンバーごとにコンポーネントが1つずつあるような、順序付けられたコレクションを所有するとみなすことができます。 DynStructオブジェクトは、structのメンバーに関連付けられるDynAnyオブジェクトを新規作成するための操作をエクスポートします。

別の(構築型) DynAnyからDynAnyオブジェクトを得た場合(たとえばDynStructから作成された、構造体メンバーを表すDynAny)、そのメンバーであるDynAnyは、DynStructに論理的に含まれることになります。 insertまたはget操作を呼び出しても、現在位置は変更されません。 最上位のDynAnyオブジェクト(別のDynAnyのコンポーネントではないもの)を破棄すると、そのコンポーネントのDynAnyオブジェクトも破棄されます。 最上位ではないDynAnyを破棄した場合は何も起こりません。 破棄された最上位のDynAny、またはその下位オブジェクトに対して操作を呼び出すと、OBJECT_NOT_EXISTがスローされます。 DynAnyを破棄したあとも、それに関連付けられるデータ値のコンポーネントを操作するには、まずコンポーネントのDynAnyを作成してから、作成したDynAnyオブジェクトのコピーを作成します。

DynAnyオブジェクトの動作は、割り当てられたメモリー空間とアクセス速度に関して効果的な実装を実現できるように定義されています。 DynAnyオブジェクトは、実行時にanyから抽出された値のトラバースや、anyの値の構築を行うために使用することが想定されています。 ほかの用途での使用はお勧めできません。

DynAnyオブジェクトの操作

Insertgetの各操作は、基本DynAnyオブジェクトの操作に必要ですが、構築型DynAnyオブジェクトの操作にも役立ちます。 構築型DynAnyオブジェクトに基本データ型の値を挿入すると、DynAnyオブジェクトに関連付けられた構築型データ値の現在のコンポーネントを初期化することになります。 たとえば、DynStructinsert_booleanを呼び出すと、関連するstructのデータ値の現在位置にbooleanのデータ値が挿入されます。 値のTypeCodeDynAnyに含まれるTypeCodeと同じである場合、値の挿入と抽出を通して型は同じになります。DynAnyにコンポーネントがある場合は、値の挿入と抽出における型は現在位置のDynAnyTypeCodeと同じになります。

基本的なオペレーションには次のものがあります。

  • insert_boolean、get_boolean
  • insert_char、get_char
  • insert_short、get_short
  • insert_ushort、get_ushort
  • insert_long、get_long
  • insert_ulong、get_ulong
  • insert_double、get_double
  • insert_string、get_string
  • insert_reference、get_reference
  • insert_typecode、get_typecode
  • insert_longlong、get_longlong
  • insert_ulonglong、get_ulonglong
  • insert_longdouble、get_longdouble
  • insert_wchar、get_wchar
  • insert_wstring、get_wstring
  • insert_any、get_any
  • insert_dyn_any、get_dyn_any
  • insert_val、get_val
  • insert_octet、get_octet
  • insert_float、get_float
  • get_value
  • get_as_string
  • get_as_ulong
  • get_members
  • get_members_as_dyn_any
  • get_discriminator
  • get_length
  • get_elements
  • get_elements_as_dyn_any
  • get_boxed_value
  • get_boxed_value_as_dyn_any

DynAnyオブジェクトとDynAnyFactoryオブジェクトは、それらが作成および使用されるプロセスに対してローカルであると想定されています。 つまり、DynAnyおよびDynAnyFactoryオブジェクトへの参照をほかのプロセスにエクスポートしたり、ORB.object_to_string()で外部化したりすることはできません。 実行を試みるとMARSHALシステム例外が発生します。 IDLにインタフェースが指定されているため、DynAnyオブジェクトでは標準のorg.omg.CORBA.Objectインタフェースに定義されている操作をエクスポートできます。 ただし、Objectインタフェースを通してエクスポートした操作を呼び出そうとすると、標準NO_IMPLEMENT例外が発生することがあります。 DynAnyオブジェクトをDIIと使用しようとすると、NO_IMPLEMENT例外が発生する場合があります。

パッケージの仕様

Java(TM) Platform, Standard Edition 6 ORBが準拠する公式の仕様のサポート・セクションの正確なリストは、「Java(TM) SE 6での正式なCORBAサポート仕様」を参照してください。

導入されたバージョン:
1.4