Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Differences Between the Lifetime of C++ and Java Objects"

From Apache OpenOffice Wiki
Jump to: navigation, search
m (New page: {{Documentation/DevGuide/ProUNOTOC |ProUNO2b=block |ProUNO2bLife=block |ShowPrevNext=block |PrevPage=Documentation/DevGuide/ProUNO/Weak Objects and References |NextPage=Documentation/DevGu...)
 
m
Line 1: Line 1:
{{Documentation/DevGuide/ProUNOTOC
+
{{Documentation/DevGuide/ProUNOTOC/Zh
 
|ProUNO2b=block
 
|ProUNO2b=block
 
|ProUNO2bLife=block
 
|ProUNO2bLife=block
 
|ShowPrevNext=block
 
|ShowPrevNext=block
|PrevPage=Documentation/DevGuide/ProUNO/Weak Objects and References
+
|PrevPage=Zh/Documentation/DevGuide/ProUNO/Weak Objects and References
|NextPage=Documentation/DevGuide/ProUNO/Object Identity
+
|NextPage=Zh/Documentation/DevGuide/ProUNO/Object Identity
 
}}
 
}}
 
[[en:Documentation/DevGuide/ProUNO/Differences Between the Lifetime of C++ and Java Objects]]
 
[[en:Documentation/DevGuide/ProUNO/Differences Between the Lifetime of C++ and Java Objects]]
 
{{DISPLAYTITLE:Differences Between the Lifetime of C++ and Java Objects}}
 
{{DISPLAYTITLE:Differences Between the Lifetime of C++ and Java Objects}}
  
{{Documentation/Note|开始本节之前,请先阅读 [[Documentation/DevGuide/ProUNO/C++/C++ Language Binding|专业 UNO - UNO 语言绑定 - C++ 语言绑定]] 和 [[Documentation/DevGuide/ProUNO/Java/Java Language Binding|专业 UNO - UNO 语言绑定 - Java 语言绑定Java Language Binding]] 以了解有关语言绑定的信息,并阅读 [[Documentation/DevGuide/WritingUNO/C++/C++ Component|编写 UNO 组件 - C++ 组件]] 和 [[Documentation/DevGuide/WritingUNO/Storing the Service Manager for Further Use|编写 UNO 组件 - Java 中的简单组件 - 存储服务管理器已备后用]] 以了解有关组件实现的信息。}}
+
{{Documentation/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 中的简单组件 - 存储服务管理器已备后用]] 以了解有关组件实现的信息。}}
  
  

Revision as of 08:26, 1 July 2008

Template:Documentation/Note


在 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).
Personal tools
In other languages