モジュール java.corba
パッケージ org.omg.DynamicAny

インタフェースDynAny

  • すべてのスーパー・インタフェース:
    DynAnyOperations, IDLEntity, Object, Serializable
    既知のすべてのサブインタフェース:
    DynArray, DynEnum, DynFixed, DynSequence, DynStruct, DynUnion, DynValue, DynValueBox, DynValueCommon
    既知のすべての実装クラス:
    _DynAnyStub, _DynArrayStub, _DynEnumStub, _DynFixedStub, _DynSequenceStub, _DynStructStub, _DynUnionStub, _DynValueStub


    public interface DynAny
    extends DynAnyOperations, Object, IDLEntity
    Anyの値は、DynAnyオブジェクトを通して動的に解釈(トラバース)および構築できます。 DynAnyオブジェクトは、anyに挿入される値のコピーに対応するデータ値に関連付けられます。

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

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

    構築型と関連付けられたDynAnyオブジェクトを、構築型DynAnyオブジェクトといいます。 IDLの各種構築型(fixed、enum、struct、sequence、union、array、exception、値型)のそれぞれについて、DynAnyインタフェースから継承されたインタフェースがあります。

    構築型DynAnyオブジェクトは、DynAnyオブジェクトを新規作成するための操作をエクスポートします。作成されるオブジェクトはそれぞれ構築型のデータ値のコンポーネントに関連付けられます。 たとえば、DynStructはstruct値と関連付けられます。 つまり、DynStructは、構造体のメンバーごとにコンポーネントが1つずつあるような、順序付けられたコレクションを所有するとみなすことができます。 DynStructオブジェクトは、structのメンバーに関連付けられるDynAnyオブジェクトを新規作成するための操作をエクスポートします。

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

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

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

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