Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Differences Between the Lifetime of C++ and Java Objects"
m |
|||
(2 intermediate revisions by one other user not shown) | |||
Line 6: | Line 6: | ||
|NextPage=Zh/Documentation/DevGuide/ProUNO/Object Identity | |NextPage=Zh/Documentation/DevGuide/ProUNO/Object Identity | ||
}} | }} | ||
− | + | {{DISPLAYTITLE:C++ 对象与 Java 对象的生存期之间的差异}} | |
− | {{ | + | {{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/{{SUBPAGENAME}}}} |
− | {{ | + | {{Note|开始本节之前,请先阅读 [[Zh/Documentation/DevGuide/ProUNO/C++/C++ Language Binding|专业 UNO - UNO 语言绑定 - C++ 语言绑定]] 和 [[Zh/Documentation/DevGuide/ProUNO/Java/Java Language Binding|专业 UNO - UNO 语言绑定 - Java 语言绑定Java Language Binding]] 以了解有关语言绑定的信息,并阅读 [[Zh/Documentation/DevGuide/WritingUNO/C++/C++ Component|编写 UNO 组件 - C++ 组件]] 和 [[Zh/Documentation/DevGuide/WritingUNO/Storing the Service Manager for Further Use|编写 UNO 组件 - Java 中的简单组件 - 存储服务管理器已备后用]] 以了解有关组件实现的信息。}} |
Latest revision as of 17:17, 4 July 2018
开始本节之前,请先阅读 专业 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). |