友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第211章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




令里不规定想调用哪个版本,JVM 就会试着自行判断。但这一操作会在程序执行时花费较长的时间。所以, 

我们一般可用ansi,unicode 或 auto 修改符硬性规定。  

欲了解这些特性更详细的情况,请参考微软公司提供的技术文档。  



A。4 本原接口(RNI )  



同J/Direct 相比,RNI 是一种比非 Java 代码复杂得多的接口;但它的功能也十分强大。RNI 比J/Direct 更 

接近于 JVM,这也使我们能写出更有效的代码,能处理固有方法中的 Java 对象,而且能实现与JVM 内部运行 

机制更紧密的集成。  

RNI 在概念上类似Sun 公司的JNI。考虑到这个原因,而且由于该产品尚未正式完工,所以我只在这里指出它 

们之间的主要差异。欲了解更详细的情况,请参考微软公司的文档。  

JNI 和 RNI 之间存在几方面引人注目的差异。下面列出的是由msjavah 生成的 C 头文件(微软提供的msjavah 

在功能上相当于Sun 的 javah),应用于前面在JNI 例子里使用的 Java 类文件 ShowMsgBox。  

  

/*  DO NOT EDIT   

automatically generated by msjavah  */  

#include   

#pragma warning(disable:4510)  

#pragma warning(disable:4512)  

#pragma warning(disable:4610)  

  

struct Classjava_lang_String;  

#define Hjava_lang_String Classjava_lang_String  

  

/*  Header for class ShowMsgBox  */  

  

#ifndef _Included_ShowMsgBox  

#define _Included_ShowMsgBox  

  

#define HShowMsgBox ClassShowMsgBox  

typedef struct ClassShowMsgBox {  

#include   

  long MSReserved;  

#include   

} ClassShowMsgBox;  

  

#ifdef __cplusplus  

extern 〃C〃 {  

#endif  

__declspec(dllexport) void __cdecl   

ShowMsgBox_ShowMessage (struct HShowMsgBox *;   

  struct Hjava_lang_String *);  

#ifdef __cplusplus  

}  

#endif  

  

#endif  /* _Included_ShowMsgBox */  

  

#pragma warning(default:4510)  



                                                                                             660 


…………………………………………………………Page 662……………………………………………………………

#pragma warning(default:4512)  

#pragma warning(default:4610)  

  

除可读性较差外,代码里还隐藏着一些技术性问题,待我一一道来。  

在RNI 中,固有方法的程序员知道对象的二进制布局。这样便允许我们直接访问自己希望的信息;我们不必 

象在JNI 里那样获得一个字段或方法标识符。但由于并非所有虚拟机都需要将相同的二进制布局应用于自己 

的对象,所以上面的固有方法只能在Microsoft JVM 下运行。  

在JNI 中,通过JNIEnv 自变量可访问大量函数,以便同JVM 打交道。在 RNI 中,用于控制JVM 运作的函数变 

成了可直接调用。它们中的某一些(如控制异常的那一个)类似于它们的 JNI “兄弟”。但大多数RNI 函数 

都有与JNI 中不同的名字和用途。  

JNI 和 RNI 最重大的一个区别是“垃圾收集”的模型。在 JNI 中,垃圾收集在固有方法执行期间遵守与Java 

代码执行时相同的规则。而在 RNI 中,要由程序员在固有方法活动期间自行负责“垃圾收集器”器的启动与 

中止。默认情况下,垃圾收集器在进入固有方法前处于不活动状态;这样一来,程序员就可假定准备使用的 

对象用不着在那个时间段内进行垃圾收集。然而一旦固有方法准备长时间执行,程序员就应考虑激活垃圾收 

集器——通过调用GCEnable()这个RNI 函数(GC 是“Garbage Collector”的缩写,即“垃圾收集”)。  

也存在与全局句柄特性类似的机制——程序员可利用可保证特定的对象在 GC 活动期间不至于被当作“垃圾” 

收掉。概念是类似的,但名称有所差异——在 RNI 中,人们把它叫作GCFrames 。  



A。4。1 RNI 总结  



RNI 与 Microsoft JVM 紧密集成这一事实既是它的优点,也是它的缺点。RNI 比JNI 复杂得多,但它也为我们 

提供了对JVM 内部活动的高度控制;其中包括垃圾收集。此外,它显然针对速度进行了优化,采纳了C 程序 

员熟悉的一些折衷方案和技术。但除了微软的 JVM 之外,它并不适于其他 JVM。  



A。5 Java/ 集成  



 (以前称为OLE)代表微软公司的“组件对象模型”(ponent Object Model ),它是所有ActiveX 技 

术(包括ActiveX 控件、Automation 以及ActiveX 文档)的基础。但  还包含了更多的东西。它是一种特 

殊的规范,按照它开发出来的组件对象可通过操作系统的专门特性实现“相互操作”。在实际应用中,为 

Win32 系统开发的所有新软件都与 有着一定的关系——操作系统通过  对象揭示出自己的一些特性。 

由其他厂商开发的组件也可以建立在 的基础上,我们能创建和注册自己的 组件。通过这样或那样的 

形式,如果我们想编写 Win32 代码,那么必须和  打交道。在这里,我们将仅仅重述  编程的基本概 

念,而且假定读者已掌握了 服务器(能为  客户提供服务的任何 对象)以及  客户(能从 

服务器那里申请服务的一个 对象)的概念。本节将尽可能地使叙述变得简单。工具实际的功能要强大得 

多,而且我们可通过更高级的途径来使用它们。但这也要求对  有着更深刻的认识,那已经超出了本附录 

的范围。如果您对这个功能强大、但与不同平台有关的特性感兴趣,应该研究 和微软公司的文档资料, 

仔细阅读有关Java/ 集成的那部分内容。如果想获得更多的资料,向您推荐 Dale Rogerson 编著的 

 《Inside 》,该书由 Microsoft Press 于 1997 年出版。  

由于 是所有新型 Win32 应用程序的结构核心,所以通过Java 代码使用(或揭示) 服务的能力就显得 

尤为重要。Java/ 集成无疑是 Microsoft Java 编译器以及虚拟机最有趣的特性。Java 和 在它们的模 

型上是如此相似,所以这个集成在概念上是相当直观的,而且在技术上也能轻松实现无缝结合——为访问 

,几乎不需要编写任何特殊的代码。大多数技术细节都是由编译器和/或虚拟机控制的。最终的结果便是 

Java 程序员可象对待原始Java 对象那样对待  对象。而且  客户可象使用其他  服务器那样使用由 

Java 实现的 服务器。在这里提醒大家,尽管我使用的是通用术语“”,但根据扩展,完全可用Java 

实现一个ActiveX Automation 服务器,亦可在Java 程序中使用一个ActiveX 控件。  

Java 和 最引人注目的相似之处就是 接口与 Java 的“interface”关键字的关系。这是接近完美的一 

种相符,因为:  

■ 对象揭示出了接口(也只有接口)  

■ 接口本身并不具备实施方案;要由揭示出接口的那个 对象负责它的实施  

■ 接口是对语义上相关的一组函数的说明;不会揭示出任何数据  

■ 类将 接口组合到了一起。Java 类可实现任意数量的 Java 接口。  

■ 有一个引用对象模型;程序员永远不可能“拥有”一个对象,只能获得对对象一个或多个接口的引 

用。Java 也有一个引用对象模型——对一个对象的引用可“造型”成对它的某个接口的引用。  



                                                                    661 


…………………………………………………………Page 663……………………………………………………………

■ 对象在内存里的“生存时间”取决于使用对象的客户数量;若这个数量变成零,对象就会将自己从内 

存中删去。在Java 中,一个对象的生存时间也由客户的数量决定。若不再有对那个对象的引用,对象就会等 

候垃圾收集器的处理。  

  

Java 与 之间这种紧密的对应关系不仅使 Java 程序员可以方便地访问  特性,也使 Java 成为编写 

代码的一种有效语言。 是与语言无关的,但 开发事实上采用的语言是 C++和 Visual Basic。同Java 

相比,C++在进行  开发时显得更加强大,并可生成更有效的代码,只是它很难使用。Visual Basic 比 

Java 简单得多,但它距离基础操作系统太远了,而且它的对象模型并未实现与  很好的对应(映射)关 

系。Java 是两者之间一种很好的折衷方案。  

接下来,让我们对  开发的一些关键问题进行讨论。编写Java/ 客户和服务器时,这些问题是首先需要 

弄清楚的。  



A。5。1  基础  



 是一种二进制规范,致力于实施可相互操作的对象。例如, 认为一个对象的二进制布局必须能够调用 

另一个 对象里的服务。由于是对二进制布局的一种描述,所以只要某种语言能生成这样的一种布局,就 

可通过它实现 对象。通常,程序员不必关注象这样的一些低级细节,因为编译器可自动生成正确的布 

局。例如,假设您的程序是用 C++写的,那么大多数编译器都能生成符合 规范的一张虚拟函数表格。对 

那些不生成可执行代码的语言,比如VB 和Java,在运行期则会自动挂接到。  

 库也提供了几个基本的函数,比如用于创建对象或查找系统中一个已注册  类的函数。  

一个组件对象模型的基本目标包括:  

■让对象调用其他对象里的服务  

■允许新类型对象(或更新对象)无缝插入环境  

第一点正是面向对象程序设计要解决的问题:我们有一个客户对象,它能向一个服务器对象发出请求。在这 

种情况下,“客户”和“服务器”这两个术语是在常规意义上使用的,并非指一些特定的硬件配置。对于任 

何面向对象的语言,第一个目标都是很容易达到的——只要您的代码是一个完整的代码块,同时实现了服务 

器对象代码以及客户对象代码。若改变了客户和服务器对象相互间的沟通形式,只需简单地重新编译和链接 

一遍即可。重新启动应用程序时,它就会自动采用组件的最新版本。  

但假若应用程序由一些未在自己控制之下的组件对象构成,情况就会变得迥然有异——我们不能控制它们的 

源码,而且它们的更新可能完全独立于我们的应用程序进行。例如,当我们在自己的程序里使用由其他厂商 

开发的ActiveX 控件时,就会面临这一情况。控件会安装到我们的系统里,我们的程序能够(在运行期)定 

位服务器代码,激活对象,同它建立链接,然后使用它。以后,我们可安装控件的新版本,我们的应用程序
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!