C++ 对象与 Java 对象的生存期之间的差异
| 开始本节之前,请先阅读 专业 UNO - UNO 语言绑定 - C++ 语言绑定 和 专业 UNO - UNO 语言绑定 - Java 语言绑定Java Language Binding 以了解有关语言绑定的信息,并阅读 编写 UNO 组件 - C++ 组件 和 编写 UNO 组件 - Java 中的简单组件 - 存储服务管理器已备后用 以了解有关组件实现的信息。 |
在 Java UNO 和 C++ UNO 中,引用计数规范的实现有所不同。在 C++ UNO 中,每个对象维护自己的引用计数器。当实现、实例化、获取一个 C++ UNO 对象以及后来释放该对象时,会立即调用该对象的析构函数。下面的示例使用了标准的 Helper 类 ::cppu::OWeakObject 并在调用析构函数时打印一条消息。
class MyOWeakObject : public ::cppu::OWeakObject
{
public:
MyOWeakObject() { fprintf( stdout, "constructed\n" ); }
~MyOWeakObject() { fprintf( stdout, "destroyed\n" ); }
};
在下面的方法中,演示了如何创建一个新的 MyOWeakObject,以及获取和释放该对象。调用 release() 立即导致 MyOWeakObject 析构。如果使用 Reference<> 模板,就无需考虑 acquire() 和 release()。
void simple_object_creation_and_destruction()
{
// create the UNO object
com::sun::star::uno::XInterface * p = new MyOWeakObject();
// acquire it
p->acquire();
// release it
fprintf( stdout, "before release\n" );
p->release();
fprintf( stdout, "after release\n" );
}
此代码段产生以下输出:
constructed before release destroyed after release
Java UNO 对象的行为有所不同,因为它们是由垃圾收集器在选择时结束的。在 Java UNO 语言绑定中,com.sun.star.uno.XInterface 没有方法,因此,虽然 MyUnoObject 实现 XInterface,但不需要实现任何方法:
class MyUnoObject implements com.sun.star.uno.XInterface {
public MyUnoObject() {
}
void finalize() {
System.out.println("finalizer called");
}
static void main(String args[]) throws java.lang.InterruptedException {
com.sun.star.uno.XInterface a = new MyUnoObject();
a = null;
// ask the garbage collector politely
System.gc();
System.runFinalization();
System.out.println("leaving");
// It is java VM dependent, whether or not the finalizer was called
}
}
此代码的输出取决于 Java VM 实现。输出 “finalizer called” 不是常规的结果。请注意 UNO 将 Java 与 C++ 结合在一起时的负面影响。
将 UNO C++ 对象映射到 Java 时,会创建一个 Java 代理服务器对象,该对象保持对 C++ 对象的
UNO 硬引用。UNO 核心负责此映射。Java 代理服务器仅在进入 finalize() 方法时才清除引用,因而会延迟析构 C++ 对象,直到 Java VM 收集到一些垃圾。
将 UNO Java 对象映射到 C++ 时,会创建一个 C++ 代理服务器对象,该对象保持对 Java 对象的 UNO 硬引用。在内部,Java UNO 桥保持对原始 Java 对象的 Java 引用。不再使用 C++ 代理服务器时,会立即将其析构。Java UNO 桥获得通知后,立即释放对原始 Java 对象的 Java 引用。何时结束 Java 对象取决于垃圾收集器。
将一个 Java 程序连接到一个正在运行的 OpenOffice.org,不会析构办公软件进程中的 UNO 对象,直到垃圾收集器结束 Java 代理服务器,或者直到关闭进程间连接(请参阅 专业 UNO - UNO 概念 - UNO 进程间连接)。
| Content on this page is licensed under the Public Documentation License (PDL). |