处理接口
服务管理器是在服务进程中创建的,而 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). |