处理接口

From Apache OpenOffice Wiki
< Zh‎ | Documentation
Revision as of 06:55, 2 July 2008 by Jirong (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


服务管理器是在服务进程中创建的,而 Java UNO 远程桥确保将其 XInterface 传输回客户机。构造一个可供客户端代码使用的 Java 代理服务器对象。此对象称为初始对象,因为它是桥建立的第一个对象。通过此对象获取另一个对象时,桥建立一个新代理服务器。例如,调用一个返回接口的函数。也就是说,原始对象实际上在服务器进程(办公软件)中执行,而且通过桥转发对代理服务器的调用。不仅转换接口,而且转换函数参数、返回值和异常。


Java 桥按接口映射对象,也就是说,在第一步中,只转换 API 引用中说明的函数返回的接口。例如,如果您拥有服务管理器并用它来创建另一个组件,则首先获取一个 com.sun.star.uno.XInterface

  XInterface xint= (XInterface)
  serviceManager.createInstance("com.sun.star.bridge.oleautomation.Factory");


从服务说明中了解到 Factory 实现 com.sun.star.lang.XMultiServiceFactory 接口。但是,不能对对象进行强制转换,或调用对象的接口函数,因为对象只是一个仅用于一个接口 XInterface 的代理服务器。因此,必须使用一种随 Java 桥一起提供的机制来根据需要生成代理服务器对象。例如:

  XMultiServiceFactory xfac = (XMultiServiceFactory) UnoRuntime.queryInterface(
      XMultiServiceFactory.class, xint);


如果 xint 是一个代理服务器,则 queryInterface() 就会为 XMultiServiceFactory 分发另一个代理服务器,条件是原始对象实现该代理服务器。接口代理服务器可以用作其他代理服务器对象函数调用中的参数。例如:

  // client side
  // obj is a proxy interface and returns another interface through its func() method
  XSomething ret = obj.func();
 
  // anotherObject is a proxy interface, too. Its method func(XSomething arg)
  // takes the interface ret obtained from obj
  anotherObject.func(ret);

在服务器进程中,obj 对象会收到作为函数参数的原始 ret 对象。


客户端也可能有 Java 组件。这些组件也可以用作函数参数,然后桥就会在服务器进程中为它们设置 代理服务器。


并非 UNO 的所有语言概念在 Java 中都有一个对应的语言元素。例如,不存在结构和各种 out 参数。有关这些概念如何映射的信息,请参阅 专业 UNO - UNO 语言绑定 - Java 语言绑定 - 类型映射


通常情况下,接口处理需要 com.sun.star.uno.XInterface 能够通过引用计数来获取和释放对象。在 Java 中,程序员不会因为 acquire()release() 而烦恼,因为使用 com.sun.star.uno.UnoRuntime.queryInterface() 后,Java UNO 运行时自动在服务器端获取对象。而当 Java 垃圾收集器删除您的引用时,Java UNO 运行时释放相应的办公软件对象。如果用 Java 编写一个 UNO 对象,不使用任何引用计数来控制对象的生存期。垃圾收集器会承担此责任。


有时,需要查明两个接口是否属于同一对象。在 Java 中,您可以用等号 '==' 来比较引用。只要接口引用本地 Java 对象,这就有效。通常来说,接口是代理服务器,且实际对象驻留在一个远程进程中。多个代理服务器可以属于同一个对象,因为对象按接口桥接在一起。这些代理服务器为 Java 对象,比较其引用不会使其成为同一对象的组成部分。要确定接口是否为同一个 UNO 对象的组成部分,请使用 com.sun.star.uno.UnoRuntime 类的方法 areSame()

  static public boolean areSame(Object object1, Object object2)
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages