Module  java.corba
软件包  org.omg.DynamicAny

Interface DynAny

  • All Superinterfaces:
    DynAnyOperationsIDLEntityObjectSerializable
    All Known Subinterfaces:
    DynArrayDynEnumDynFixedDynSequenceDynStructDynUnionDynValueDynValueBoxDynValueCommon
    所有已知实现类:
    _DynAnyStub_DynArrayStub_DynEnumStub_DynFixedStub_DynSequenceStub_DynStructStub_DynUnionStub_DynValueStub


    public interface DynAny
    extends DynAnyOperations, Object, IDLEntity
    任何值都可以动态解释(遍历)并通过DynAny对象构造。 DynAny对象与数据值相关联,数据值对应于插入任何值的副本。

    DynAny对象可以被视为组件DynAnys的有序集合。 对于代表基本类型(如long)或无组件类型(如空异常)的DynAnys,组件的有序集合为空。 每个DynAny对象将当前位置的概念维护到其组件DynAnys的集合中。 当前位置由从0到n-1运行的索引值来标识,其中n是组件的数量。 特殊索引值-1表示当前位置。 对于不能具有当前位置的值(如空异常),索引值固定为-1。 如果使用具有组件的值初始化DynAny,则索引将初始化为0.创建未初始化的DynAny(即,没有值但具有允许组件的TypeCode的DynAny)之后,当前位置取决于类型由DynAny代表的价值。 (当前位置设置为0或-1,具体取决于新的DynAny是否为其组件获取默认值。)

    迭代操作倒退,查找和下一个可以用于更改当前位置,并且current_component操作返回当前位置的组件。 component_count操作返回DynAny的组件数。 总而言之,这些操作可以对DynAny的组件执行迭代,例如(递归)检查其内容。

    构造的DynAny对象是与构造类型相关联的DynAny对象。 有一个不同的接口,从DynAny接口继承,与IDL(固定,枚举,结构,序列,联合,数组,异常和值类型)中的每种构造类型相关联。

    构造的DynAny对象导出可以创建新的DynAny对象的操作,每个对象都与构造的数据值的组件相关联。 作为示例,DynStruct与一个结构体值相关联。 这意味着DynStruct可能被视为拥有一个有序的组件集合,每个结构成员一个。 DynStruct对象导出可以创建新的DynAny对象的操作,每个对象都与结构体的成员相关联。

    如果已经从另一个(构造的)DynAny对象获取DynAny对象,例如DynAny表示从DynStruct创建的结构成员,则DynAny会在逻辑上包含DynStruct。 调用插入或获取操作使当前位置保持不变。 销毁顶层DynAny对象(未作为另一个DynAny的组件获取的对象)也会销毁从其获取的任何组件DynAny对象。 销毁非顶级DynAny对象什么都不做。 对已销毁的顶级DynAny或其任何后代调用操作会引发OBJECT_NOT_EXIST。 如果程序员想要销毁一个DynAny对象,但是仍然想要操作与它相关联的数据值的某个组件,那么他或她应该首先为该组件创建一个DynAny,然后创建一个创建的DynAny对象的副本。

    已经定义了DynAny对象的行为,以便在分配的内存空间和访问速度方面实现高效的实现。 DynAny对象旨在用于遍历从anys提取的值或在运行时构建anys的值。 不建议将其用于其他目的。

    处理基本的DynAny对象需要插入和获取操作,但也有助于处理构造的DynAny对象。 将基本数据类型值插入构造的DynAny对象意味着初始化与DynAny对象关联的构造数据值的当前组件。 例如,在DynStruct上调用insert_boolean意味着在关联的struct数据值的当前位置插入一个布尔数据值。 如果TypeCode等同于DynAny中包含的TypeCode,或者如果DynAny具有组件,则类型与当前位置的DynAny的TypeCode相当,则该类型与插入或提取值是一致的。

    DynAny和DynAnyFactory对象旨在在其创建和使用的进程的本地。 这意味着对DynAny和DynAnyFactory对象的引用不能导出到其他进程,或者使用ORB.object_to_string()进行外部化。 如果尝试这样做,违规行为会引发MARSHAL系统异常。 由于它们的接口在IDL中指定,所以DynAny对象导出在标准org.omg.CORBA.Object接口中定义的操作。 但是,任何调用通过Object接口导出的操作的尝试可能会引发标准的NO_IMPLEMENT异常。 尝试在DII中使用DynAny对象可能会引发NO_IMPLEMENT异常。