• 沒有找到結果。

本节介绍如何将  UNO 映射到各种编程语言或组件模型。此语言绑定有时称为  UNO  运行时 环境(URE) 。每个 URE 都需要符合前面各章节中所述的规范。本节还将说明 UNO 服务和接口 的使用。

以下各节提供了下列主题的详细信息:

l 将所有 UNO 类型映射成编程语言类型。

l 将 UNO  异常处理映射到编程语言。

l 映射基本的对象功能(查询接口、对象生存期、对象标识)。

l 引导服务管理器。其他编程语言特有的材料(如 C++ UNO 中的核心程序库)。

目前支持 Java、C++、RedOffice Basic 以及 Windows 32 平台上支持 MS OLE Automation 或公 共语言基础结构(CLI)的所有语言,将来可能会扩大支持的语言绑定数量。

4.7.1 Java 语言绑定 

Java  语言绑定使开发者可以将 Java 或 UNO 组件用于客户机程序。 由于可以无缝地与 UNO 桥 进行交互,Java 程序可以访问用其他语言编写并用不同编译器构建的组件以及远程对象。 

Java 提供了可以在客户机程序或组件实现中使用的多个类。但是,当需要与其他 UNO 对象交 互时,请使用 UNO 接口,因为桥仅识别这些接口,并且可以将这些接口映射到其他环境。

要从客户机程序控制办公软件,客户机需要安装  Java  1.3(或更高版本)、可用的套接字端口 以及以下 jar 文件:juh.jar、jurt.jar、ridl.jar 和 unoil.jar。服务器端无需安装  Java 程序。

使用 Java 组件时,办公软件已安装  Java 支持。同时确保已启用 Java:可以通过设置工具-选 项-RedOffice-安全性对话框中的一个开关选项来达到此目的。安装  RedOffice  时应该已经安装 了所有必需的 jar 文件。

“Java UNO 引用” 对 “Java UNO 运行时” 进行了说明, 可以在 RedOffice 软件开发工具包 (SDK)

中或在 api.openoffice.org  上找到“Java UNO 引用” 。 l 序列类型的映射

带有给定组件类型的 UNO 序列类型被映射成带有对应组件类型的 Java 数组类型。

l  UNO sequence<long>被映射成 Java int[]。

l  UNO sequence< sequence<long> >被映射成 Java int[][]。

只有对这些 Java 数组类型的非空引用才是有效的。通常情况下,也可以使用对其他 Java 数组 类型 (与给定的数组类型是指定兼容的) 的非空引用, 但这样做会造成 java.lang.ArrayStoreException。

在 Java 中,一个数组的最大长度是有限的,因此,如果在 Java  语言绑定的环境中使用的 UNO 序 列太长将会出错。 

1.枚举类型的映射 

UNO  枚举类型被映射为同名的公共最终  Java  类,它从  com.sun.star.uno.Enum  类派生而来。

只有对生成的最终类的非空引用才是有效的。

4

Chapter 

UNO  Java 

void  void 

boolean  boolean 

byte  byte 

short  short 

unsigned short  short 

long  int 

unsigned long  int 

hyper  long 

unsigned hyper  long 

float  float 

double  double 

char  char 

string  java.lang.String 

type  com.sun.star.uno.Type 

any  java.lang.Object/com.sun.star.uno.Any  图 14 

此基类  com.sun.star.uno.Enum  声明存储实际值的保护成员、初始化值的保护构造函数以及获 取 实际 值的公 共  getValue()方 法。生 成的 最终类 拥有 一个 保护构 造函 数以及 一个公 共方 法  getDefault(),后者返回一个实例,此实例以第一个枚举成员的值为默认值。对于 UNO  枚举类型的 各成员,对应的 Java 类声明给定 Java 类型的一个公共静态成员,该类型用 UNO  枚举成员的值进 行初始化。枚举类型的 Java 类有一个附加的公共方法 fromInt(),此方法返回包含指定值的实例,

如以下 IDL  定义用于 com.sun.star.uno.TypeClass: 

module com { module sun { module star { module uno { 

public final class TypeClass extends com.sun.star.uno.Enum {  private TypeClass(int value) { 

super(value); 

public static TypeClass getDefault() {  return INTERFACE;

4 Chapter 

4 数的一般 Java 类。对于 com.sun.star.beans.Optional,这意味着对应的 Java 1.5 类与以下示例类似: 

package com.sun.star.beans; 

这种多态结构类型模板的实例很自然地映射成  Java  1.5。例如,UNO  Optional<string>映射成  Java  Optional<String>。但是,通常映射成原始 Java 类型的 UNO 类型参数映射成相应的 Java 包装 类型:

l  boolean 映射成 java.lang.Boolean。

4 Chapter

l  byte 映射成 java.lang.Byte。

l  short 和 unsigned short 映射成 java.lang.Short。

l  long 和 unsigned long 映射成 java.lang.Integer。

l  hyper 和 unsigned hyper 映射成 java.lang.Long。

l  float 映射成 java.lang.Float。

l  double 映射成 java.lang.Double。

l  char 映射成 java.lang.Character。

例 如 , UNO  Optional<long> 映 射 成  Java  Optional<Integer> 。 还 要 注 意 , any  和  com.sun.star.uno.XInterface  的  UNO  类型参数都映射成  java.lang.Object,因此,Optional<any>和  Optional<XInterface>  都映射成 Java Optional<Object>。

处理默认构造的多态结构类型实例的参数成员时,仍然存在少数问题和缺陷。一个问题是默认 构造函数将这种成员初始化为 null,但是,除 any 的值或接口类型以外,null 在 Java  UNO 的环境 中 通常 不是合 法值。 例如 ,new  Optional<PropertyValue>().Value  的类 型为  com.sun.star.beans. 

PropertyValue(结构类型),但它却是一个空引用。同样,newOptional<Boolean>().Value  也是一个 空引用(而不是对 Boolean.FALSE 的引用)。所选的解决方案通常允许将空引用作为 Java 类字段的 值,这些值与 UNO  多态结构类型的参数成员相对应。然而,为了避免出现任何问题,这种情况下 最好不要依赖默认构造函数, 而是要明确初始化所有有问题的字段。 请注意, 这并非真正是 Optional  的问题,如同  Optional<  T  >()  一样。对于默认构造的实例,IsPresent  始终为  false,由于  com.sun.star.beans.Optional  的 文 档 约 定 , Value  的 实 际 内 容 应 被 忽 略 , 其 他 情 况 下 , 应 忽 略  com.sun.star.beans.Ambiguous,然而,这是一个实际问题) 。

另一个缺陷是默认构造的多态结构类型实例的类型  any  的参数成员(在  Java  1.5  中为  newOptional<Object>().Value,在 C++中为 Optional<Any>  o;  o.Value)在 Java  语言绑定和 C++  语 言绑定中的值不同。在 Java 中,它包含类型  XInterface 的一个空引用(即 Java 值 null),而在 C++ 

中,它却包含 void。此外,为了避免出现任何问题,这种情况下最好不要依赖默认构造函数。

在 1.5 以前的 Java  版本中(这些版本不支持一般类型),多态结构类型模板以这样一种方法被 映射成普通的 Java 类:任何参数成员都被映射成类 java.lang.Object 的类字段。这通常没有使用一 般类型可取,因为它降低了类型安全性,但它具有与 Java  1.5  兼容的优点(实际上,单个 Java 类 文件是为给定的 UNO 结构类型模板生成的, 该类文件适用于 Java 1.5 和旧版本)。 在 1.5 以前的 Java  版本中,Optional 示例如下: 

package com.sun.star.beans; 

public class Optional {  public boolean IsPresent; 

public Object Value; 

public Optional() {} 

public Optional(boolean IsPresent, Object Value) {  this.IsPresent = IsPresent; 

this.Value = Value; 

}  }

4

Chapter

如何使用 java.lang.Object  表示任意  UNO 类型的值,其详细介绍如下:

l  UNO 类型 boolean、byte、short、long、hyper、float、double 和 char 的值通过对应的 Java  类型  java.lang.Boolean、java.lang.Byte、java.lang.Short、java.lang.Integer、java.lang.Long、 

java.lang.Float、java.lang.Double 和 java.lang.Character 的非空引用表示。

l  UNO  类型  unsigned  short、unsigned  long  和  unsigned  hyper  的值通过对应的  Java  类型  java.lang.Short、java.lang.Integer 和 java.lang.Long 的非空引用表示。这样的 Java 类型的值 是对应于有符号的 UNO 类型还是无符号的 UNO 类型必须从环境推算。

l  UNO 类型  string、type、any 和 UNO 序列、枚举、结构和接口类型(全部映射成 Java 引 用类型)的值用其标准的 Java 映射来表示。

l  UNO 类型  void 和 UNO  异常类型不能用作实例化多态结构类型的类型参数。

这 与 如 何 使 用  java.lang.Object  表 示  UNO  any  类 型 的 值 类 似 。 这 里 区 别 之 处 只 有  com.sun.star.uno.Any,它可以用来消除不同的 UNO 类型映射成 java.lang.Object 的同一个子类的情 况。相反,在此,它必须始终是从给定的 Java 引用表示的 UNO 类型的环境中推算。

对于默认构造的多态结构类型实例的参数成员,Java 1.5 中所提到的问题和缺陷也适用于 Java  旧版本。 

3.异常类型的映射 

UNO  异常类型被映射成同名的公共 Java 类。只有对这种类的非空引用才是有效的。有两个 UNO  异常是其他所有异常的基异常。 它们是 com.sun.star.uno.Exception 和 com.sun.star.uno.RuntimeException,

其他所有异常都是从它们继承的。Java 中的相应异常继承  Java  异常: 

Java 中的 com.sun.star.uno.Exception: 

package com.sun.star.uno; 

4 Chapter 

Java 中的 com.sun.star.uno.RuntimeException: 

package com.sun.star.uno; 

public class RuntimeException extends java.lang.RuntimeException {  public Object Context; 

public RuntimeException() {} 

public RuntimeException(String Message) {  super(Message); 

public RuntimeException(String Message, Object Context) {  super(Message); 

this.Context = Context; 

}  } 

如示例所示,Message  成员不存在相应的 Java 类。而是使用构造函数参数  Message 来初始化  Java  异常的基类。可通过继承的  getMessage()方法访问  Message。UNO  异常类型的其他所有成员 都被 121 映射成同名称、相应  Java 类型的公共字段。生成的 Java  异常类通常具有一个用默认值 初始化所有成员的默认构造函数,以及一个获取所有成员值的构造函数。如果一个异常继承另一个 异常,则生成的类是被继承异常的类的子类。 

4.接口类型的映射 

UNO 接口类型被映射成一个同名的公共 Java 接口。与表示  UNO 序列、枚举、结构和异常类 型的 Java 类不同,空引用对表示  UNO 接口类型的 Java 接口实际上是合法值,即 Java  空引用表示  UNO 空引用。

如果一个 UNO 接口类型继承一个或多个其他接口类型,则  Java 接口是对应的 Java 接口的子 接口。UNO 接口类型  com.sun.star.uno.XInterface  很特殊:只有当该类型用作另一个接口类型的基 类型时,它才被映射成  Java  类型  com.sun.star.uno.XInterface。在其他所有情况下(用作序列类型 的组件类型、结构或异常类型的成员或者接口 方法 的参数或返回类型时),它都被映射成  java.lang.Object。 然而, 该类型的有效  Java 值只是 Java  空引用和对实现 com.sun.star.uno.XInterface  的 java.lang.Object  这些实例的引用。

如下形式的 UNO 接口属性: 

[attribute] Type Name { 

get raises (ExceptionG1, ..., ExceptionGM); 

set raises (ExceptionS1, ..., ExceptionSM); 

}; 

用两种  Java 接口方法表示: 

Type getName() throws ExceptionG1, ..., ExceptionGM; 

void setName(Type value) throws ExceptionS1, ..., ExceptionSM; 

如果属性被标记为 readonly,则没有设置方法。属性是否被标记为 bound 对生成的 Java 方法 的签名没有影响。

如下形式的 UNO 接口方法: 

Type0 name([in] Type1 arg1, [out] Type2 arg2, [inout] Type3 arg3) raises (Exception1, ..., ExceptionN);

4

Chapter

用 Java 接口方法表示: 

Type0 name(Type1 arg1, Type2[] arg2, Type3[] arg3) throws Exception1, ..., ExceptionN; 

UNO 方法是否被标记为 oneway 对生成 Java 方法的签名没有影响。可以看出,out 和 inout 参 数要特殊处理。为了便于解释,以 UNOIDL  定义为例。 

struct FooStruct {  long nval; 

string strval; 

}; 

interface XFoo { 

string funcOne([in] string value); 

FooStruct funcTwo([inout] FooStruct value); 

sequence<byte> funcThree([out] sequence<byte> value); 

}; 

UNO 方法调用的语义是将任意  in 或 inout 参数的值从调用程序传递到被调用程序,如果方法 没有标记为 oneway  并且执行成功终止, 被调用程序将向调用程序传递回返回值和任意  out 或 inout  参数的值。因此,in 参数和返回值的处理很自然地映射成 Java 方法调用的语义。但是,UNO  out 

UNO 方法调用的语义是将任意  in 或 inout 参数的值从调用程序传递到被调用程序,如果方法 没有标记为 oneway  并且执行成功终止, 被调用程序将向调用程序传递回返回值和任意  out 或 inout  参数的值。因此,in 参数和返回值的处理很自然地映射成 Java 方法调用的语义。但是,UNO  out 

相關文件