Skip navigation links
Java™ Platform
Standard Ed. 8

Package org.omg.CORBA

提供OMG CORBA API与Java TM编程语言的映射,包括ORB类,该类 实现为程序员可以将其用作全功能对象请求代理(ORB)。

See: 描述

Package org.omg.CORBA Description

提供OMG CORBA API与Java TM编程语言的映射,包括ORB类,该类实现为程序员可以将其用作全功能的对象请求代理(ORB)。

有关官方CORBA规范的受支持部分的精确列表,Java TM平台,标准版6符合,请参阅Official Specifications for CORBA support in Java[TM] SE 6

一般信息

本节中的信息是与编辑界面定义语言(IDL)文件并使用ORB编写客户端和服务器的人相关的信息。

本节中描述的类和接口可以分为四个组: ORB classes ,异常, Helper类和Holder类。

ORB

ORB在客户端和方法在服务器上的实现之间处理(或经纪人)方法调用。 因为客户端和服务器可能在网络上的任何地方,并且由于调用和实现可能用不同的编程语言编写,所以ORB在后台进行大量的工作来完成此通信。

ORB的大部分功能对于用户来说都是完全透明的,并且CORBA包的主要部分由ORB幕后使用的类组成。 结果是大多数程序员只能直接使用这个包的一小部分。 实际上,大多数程序员只会使用ORB类中的几种方法,一些例外情况,偶尔还会有一个持有者类。

ORB方法

在应用程序进入CORBA环境之前,必须首先:

提供以下操作来初始化应用程序并获取适当的对象引用:

当应用程序需要CORBA环境时,它需要一种获取ORB对象引用和可能的OA对象引用(例如根POA)的机制。 这有两个目的。 首先,它将应用程序初始化到ORB和OA环境中。 其次,它将ORB对象引用和OA对象引用返回到应用程序,以供将来的ORB和OA操作使用。

为了获得ORB对象引用,应用程序调用ORB.init操作。 呼叫的参数可以包括需要对象引用的ORB的标识符,以及用于允许环境特定数据被传递到呼叫中的arg_list。

这些是提供对ORB访问的ORB方法:

使用没有参数的init()方法启动一个单例ORB,它只能通过idlj在Helper类中生成的代码中给出类型代码创建any所需的类型代码。

应用程序需要一种便携式手段来获取其初始对象引用。 根POA,POA Current,Interface Repository和各种对象服务实例需要引用。 应用程序所需的功能类似于命名服务提供的功能。 但是,OMG不希望将命名服务提供给所有应用程序,以便可以对其进行可移植的初始化。 因此,本节中显示的操作提供了简化的本地版本的命名服务,应用程序可以使用它来获取对其操作至关重要的小型定义的对象引用集。 因为只有一个很好的定义对象集合才能使用这种机制,所以命名上下文可以被平坦化成单级名称空间。 这种简化导致仅定义了两个操作来实现所需的功能。

初始引用通过ORB对象接口中提供的两个操作获得,提供列出和解析初始对象引用的功能。 这些是:

使用其中一些方法的示例是Getting Started with Java IDL

例外

Java IDL中的异常与使用Java编程语言编写的任何代码类似。 如果一个方法被定义为抛出异常,然后使用该方法的任何代码必须有一个catch分之try块和处理该异常,当它被抛出。

关于Java IDL exceptions文档有更多的信息,并解释了系统异常和用户定义的异常之间的区别。

以下是包装org.omg.CORBA中定义的系统异常(未经检查通过 org.omg.CORBA.SystemExceptionjava.lang.RuntimeException继承的异常 )的列表

           BAD_CONTEXT         BAD_INV_ORDER         BAD_OPERATION         BAD_PARAM         BAD_TYPECODE         COMM_FAILURE         DATA_CONVERSION         FREE_MEM         IMP_LIMIT         INITIALIZE         INTERNAL         INTF_REPOS         INVALID_TRANSACTION         INV_FLAG         INV_IDENT         INV_OBJREF         INV_POLICY         MARSHAL         NO_IMPLEMENT         NO_MEMORY         NO_PERMISSION         NO_RESOURCES         NO_RESPONSE         OBJECT_NOT_EXIST         OBJ_ADAPTER         PERSIST_STORE         TRANSACTION_REQUIRED         TRANSACTION_ROLLEDBACK         TRANSIENT         UNKNOWN  

以下是包org.omg.CORBA中定义的用户定义异常的列表。

           Bounds         UnknownUserException         WrongTransaction          PolicyError  

子包

CORBA包中有一些包, 其中包是“包”,作为其名称的一部分。 这些软件包通常非常小,因为它们所做的一切都是提供CORBA软件包中的接口和类使用的异常或类。

例如,包 org.omg.CORBA.TypeCodePackage包含两个例外通过方法在类TypeCode抛出。 这些例外是:

org.omg.CORBA.ORBPackage包含两个例外:

另一个包是CORBA包是portable包。 它提供了一组ORB API,使得一个供应商的IDL编译器生成的代码可以在另一个供应商的ORB上运行。

持有人类

支持out和inout参数传递模式需要使用额外的holder classes 由于Java编程语言不支持out或inout参数,因此需要持有者类作为传递可修改参数的方法。 为了支持便携式存根和骨架,持有者类也实现了org.omg.CORBA.portable.Streamable接口。

持有人类通过将“持有人”附加到类型的名称来命名。 该类型的名称指的是其Java编程语言中的名称。 例如,对于Java编程语言命名为Account的接口holder类将被命名为AccountHolder。

org.omg.CORBA包中的所有基本IDL数据类型都支持持有者类。 因此,举例来说,目前已经定义的类LongHolder,ShortHolder,FloatHolder,等等。 除了typedefs定义的所有用户定义的IDL类型之外, 还会生成类 (请注意,在本文中,用户定义包括在OMG规范中定义的类型,例如Interface Repository和其他OMG服务的类型。)

每个持有人类有:

默认构造函数将值字段设置为由Java语言定义的类型的默认值:

例如,如果将OMG IDL中定义的接口Account映射到Java编程语言,则将生成以下持有者类:

  public final class AccountHolder implements 
    org.omg.CORBA.portable.Streamable
{
  // field that holds an Account object
  public Account value = null;

  // default constructor
  public AccountHolder ()
  {
  }
  
  // creates a new AccountHolder from initialValue
  public AccountHolder (Account initialValue)
  {
    value = initialValue;
  }
  
  // reads the contents of i and assigns the contents to value
  public void _read (org.omg.CORBA.portable.InputStream i)
  {
    value = AccountHelper.read (i);
  }

  // writes value to o
  public void _write (org.omg.CORBA.portable.OutputStream o)
  {
    AccountHelper.write (o, value);
  }
 
  // returns the typecode for Account
  public org.omg.CORBA.TypeCode _type ()
  {
    return AccountHelper.type ();
  }

} 

关于Holder类的更多信息,请参见第1.4章, 映射在基本类型 OMG IDL to Java Language Mapping 包装org.omg.CORBA中定义的持有人类别如下:

       AnyHolder      AnySeqHolder      BooleanHolder      BooleanSeqHolder      ByteHolder      CharHolder      CharSeqHolder      CurrentHolder      DoubleHolder      DoubleSeqHolder      FixedHolder      FloatHolder      FloatSeqHolder      IntHolder      LongHolder      LongLongSeqHolder      LongSeqHolder      ObjectHolder      OctetSeqHolder      ParameterModeHolder      PolicyErrorHolder      PolicyListHolder      PrincipalHolder      ServiceInformationHolder      ShortHolder      ShortSeqHolder      StringHolder      StringSeqHolder      TypeCodeHolder      ULongLongSeqHolder      ULongSeqHolder      UnknownUserExceptionHolder      UShortSeqHolder      ValueBaseHolder      WCharSeqHolder      WrongTransactionHolder      WStringSeqHolder 

助手班

助手文件提供了几种处理类型所需的静态方法。 这些包括:

映射IDL接口或抽象接口的帮助类也包括窄操作。 静态窄方法允许将org.omg.CORBA.Object缩小为更具体类型的对象引用。 如果由于对象引用不支持所请求的类型,则narrow会导致IDL异常CORBA.BAD_PARAM抛出。 引起不同的系统异常以指示其他种类的错误。 尝试缩小null将始终成功,返回值为null 通常,应用程序员使用的唯一辅助方法是narrow方法。 其他方法通常在幕后使用,对程序员是透明的。

助手班分为两大类: helpers for value typeshelpers for non value types 因为一个类别中的所有帮助类都提供相同的方法,所以在这里给出了每类帮助类的一个通用说明。

当OMG IDL被映射到Java编程语言时,为每个用户定义的类型生成一个“帮助”类。 该生成的类将具有附加后缀Helper的用户定义类型的名称。 例如,如果界面Account在OMG IDL中定义, idlj编译器将自动生成一个名为AccountHelper的类。 AccountHelper类将包含操作类型实例所需的静态方法,在这种情况下为Account对象。

narrow方法

当一个对象是方法的返回值时,它将以通用对象的形式返回,即org.omg.CORBA.Object对象或java.lang.Object对象。 必须将该对象转换为更具体的类型才能操作。 例如, Account对象将作为通用对象返回,并且必须缩小为Account对象,以便可以调用Account方法。

narrow方法有两种形式,一种为org.omg.CORBA.Object对象,一种为java.lang.Object对象。 界面是抽象的还是narrow它的助手类将提供哪些narrow方法。 不是抽象的接口的帮助类将具有narrow方法,该方法采用CORBA对象,而抽象接口的narrow方法将采用Java编程语言中的对象。 具有至少一个抽象基础接口的非抽象接口的帮助类将提供narrow方法的两个版本。

Hello World教程使用narrow方法,如下所示:

  // create and initialize the ORB
        ORB orb = ORB.init(args, null);

        // get the root naming context
        org.omg.CORBA.Object objRef = 
            orb.resolve_initial_references("NameService");
        // Use NamingContextExt instead of NamingContext. This is 
        // part of latest Inter-Operable naming Service.  
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
 
        // resolve the Object Reference in Naming
        String name = "Hello";
        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); 

基本助手类的示例

为了解释这个目的,一个基本的帮助类是每个帮助类提供的方法,另外还有一个narrow方法,如果在OMG IDL中定义的类型映射到Java编程语言的接口。 不是类型的类型将为它们生成一个基本的帮助类。

例如,假设接口Account不是值类型IDL类型,也不是抽象接口,没有抽象的基本接口,它的AccountHelper类将如下所示:

  abstract public class AccountHelper
{
  private static String  _id = "IDL:Account:1.0";

  // inserts an Account object into an Any object
  public static void insert (org.omg.CORBA.Any a, Account that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
    a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // extracts an Account object from an Any object
  public static Account extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  
  private static org.omg.CORBA.TypeCode __typeCode = null;
  // gets the typecode for this type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc (AccountHelper.id (), "Account");
    }
    return __typeCode;
  }

  // gets the repository id for this type
  public static String id ()
  {
    return _id;
  }

  // reads an Account object from an input stream
  public static Account read (org.omg.CORBA.portable.InputStream istream)
  {
    return narrow (istream.read_Object (_AccountStub.class));
  }

  // writes an Account object to an outputstream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Account value)
  {
    ostream.write_Object ((org.omg.CORBA.Object) value);
  }

  // converts (narrows) an Object to an Account object
  public static Account narrow (org.omg.CORBA.Object obj)
  {
    if (obj == null)
      return null;
    else if (obj instanceof Account)
      return (Account)obj;
    else if (!obj._is_a (id ()))
      throw new org.omg.CORBA.BAD_PARAM ();
    else
    {
      org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
      _AccountStub stub = new _AccountStub ();
      stub._set_delegate(delegate);
      return stub;
    }
  }

} 

值类型助手类

值类型的帮助类包括为非值类型方法生成的相同方法的不同渲染。 主要区别在于值类型是可以通过值作为参数或方法的返回值传递的类型,这意味着它们必须是可序列化的。

假设Address是一个值类型, AddressHelper类将如下所示:

  abstract public class AddressHelper
{
  private static String  _id = "IDL:Address:1.0";

  // same as for non-value type
  public static void insert (org.omg.CORBA.Any a, Address that)
  {
    org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
    a.type (type ());
    write (out, that);
    a.read_value (out.create_input_stream (), type ());
  }

  // same as for non-value type
  public static Address extract (org.omg.CORBA.Any a)
  {
    return read (a.create_input_stream ());
  }

  private static org.omg.CORBA.TypeCode __typeCode = null;
  private static boolean __active = false;
  
  // getting the typecode for the type
  synchronized public static org.omg.CORBA.TypeCode type ()
  {
    if (__typeCode == null)
    {
      synchronized (org.omg.CORBA.TypeCode.class)
      {
        if (__typeCode == null)
        {
          if (__active)
          {
            return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
          }
          __active = true;
          org.omg.CORBA.ValueMember[] _members0 = new org.omg.CORBA.ValueMember[0];
          org.omg.CORBA.TypeCode _tcOf_members0 = null;
          __typeCode = org.omg.CORBA.ORB.init ().create_value_tc (_id, "Address", org.omg.CORBA.VM_NONE.value, null, _members0);
          __active = false;
        }
      }
    }
    return __typeCode;
  }

  // same as for non-value type
  public static String id ()
  {
    return _id;
  }

  // reads a serializable instance of Address from the given input stream
  public static Address read (org.omg.CORBA.portable.InputStream istream)
  {
    return (Address)((org.omg.CORBA_2_3.portable.InputStream) istream).read_value (id ());
  }

  // writes a serializable instance of Address to the given output stream
  public static void write (org.omg.CORBA.portable.OutputStream ostream, Address value)
  {
    ((org.omg.CORBA_2_3.portable.OutputStream) ostream).write_value (value, id ());
  }


} 

包装org.omg.CORBA中定义的助手类是:

        AnySeqHelper      BooleanSeqHelper      CharSeqHelper      CompletionStatusHelper      CurrentHelper      DefinitionKindHelper      DoubleSeqHelper      FieldNameHelper      FloatSeqHelper      IdentifierHelper      IDLTypeHelper      LongLongSeqHelper      LongSeqHelper      NameValuePairHelper      ObjectHelper      OctetSeqHelper      ParameterModeHelper      PolicyErrorCodeHelper      PolicyErrorHelper      PolicyHelper      PolicyListHelper      PolicyTypeHelper      RepositoryIdHelper      ServiceDetailHelper      ServiceInformationHelper      SetOverrideTypeHelper      ShortSeqHelper      StringSeqHelper      StringValueHelper      StructMemberHelper      ULongLongSeqHelper      ULongSeqHelper      UnionMemberHelper      UnknownUserExceptionHelper      UShortSeqHelper      ValueBaseHelper      ValueMemberHelper      VersionSpecHelper      VisibilityHelper      WCharSeqHelper      WrongTransactionHelper      WStringSeqHelper      WStringValueHelper  

其他类

在幕后使用的CORBA包中的其他类和接口可以分为四组。 其中三个组用于具有某种能力的请求,第四组关于Interface Repository本身就是一个类别。

ORB创建的类

第一组包含由ORB创建并包含在请求操作中使用的信息的类。

处理请求的类

第二类课程涉及要求:

作为常量的接口

第三组包含用作常量的接口。 IDL到Java映射要求IDL枚举映射到Java类,枚举值表示为该类中的public static final字段(例如DefinitionKind)。 另一方面,IDL接口外部定义的IDL常量映射到每个常量的Java接口。

这就是为什么org.omg.CORBA包中的几个接口由一个字段value组成 ,这是一个short 此字段是用于诸如错误代码或值修饰符之类的常量。 例如,接口BAD_POLICYvalue字段是被抛出的为异常PolicyError的可能原因之一。 要指定此错误代码,您将使用BAD_POLICY.value

例外PolicyError使用以下接口的value字段作为其可能的错误代码。

方法TypeCode.type_modifier返回以下接口之一的value字段。 这些接口的名称中的VM代表“值修饰符”。 以下常数由ValueMember对象的访问方法返回,以表示ValueMember对象的ValueMember NamedValue对象或方法参数中使用的这些标志在以下接口中定义:

接口存储库接口和类

第四组包含Interface Repository接口和类,它们由OMG IDL接口ir.idl的idlj编译器生成 Interface Repository的目的是识别存储在其中的接口,以便它们可被ORB访问。 Interface Repository API完全描述每个模块,类型,接口,属性,操作,参数,异常,常量等。

ORB不要求有一个接口存储库,Java IDL不包含一个。 即使此版本不包括接口存储库的实现,为了创建类型代码,已经包括以下IR类和接口(请参阅org.omg.CORBA.ORB接口中的create_value_tc,create_struct_tc,create_union_tc和create_exception_tc方法):
&nbs


相关文档

有关概述,指南和教程,请参阅:

Java IDL中未实现CORBA功能

org.omg子包中包含的一些API是为了符合当前的OMG CORBA规范而提供的,但在Sun发布的JDK TM中未实现 这使得其他JDK许可证持有者可以在标准扩展和产品中提供此API的实现。

特征抛出NO_IMPLEMENT

由于种种原因, org.omg子包中的一些API引发了NO_IMPLEMENT个异常。 其中包括:

此版本中未实现的功能或API概述


org.omg.CORBA中未实现特性的具体列表

org.omg.CORBA中未实现的方法:

从以下版本开始:
JDK1.2
Skip navigation links
Java™ Platform
Standard Ed. 8