服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

基于jcom搭建java-微软信息桥梁(上)

一、jcom简介

据gartner的研究分析,在名列全球前1000名的企业中,大约90%都混合应用了java和windows技术。然而,java技术和微软技术分别提供了丰富但却迥然不同的解决方案,或至少说这两种方案之间的差异是巨大的。

为了解决这一矛盾,sun率先提出了jni解决方案。jni,即java本机接口,是编写java本机方法和把java虚拟机嵌入到本机应用程序中的标准编程接口。java本机接口的主要目的就是保证本机方法库在不同平台上的java虚拟机中的二进制兼容性。使用jni编写程序,就可以很方便地做到程序的跨平台可移植。尽管如此,sun提供的jni解决方案只是底层的api包装,在实际开发中用到大量java/com互操作时,直接从jni级进行开发显然效率并不高。

为此,大大小小的公司甚至个人都试图提供全部或局部的java/com互操作解决方案。例如,weblogic提供的jcom技术,bridge2java(ibm提供的基于java本机接口和com技术,允许把activex对象容易地集成到java环境中),jacozoom(是一个java类库―它允许你在java程序中使用activex控件和activex服务器,基于java本机接口和com技术,允许使用于windows平台上的任何java环境中),j-integra for com(http://j-integra.intrinsyc.com/),还有一个小型的jcom桥接库(http://sourceforge.net/projects/jcom/,它也支持从java中调用com对象,例如excel工作簿,vb的com对象等)。其中,weblogic提供的jcom技术为微软的com对象和java对象提供一个稳定、无缝的机制,让这两种对象可以协同工作。

jcom,即java/com桥,它是一种用软件实现的桥接机制,可以帮助java应用程序快速访问微软的com/dcom组件。而且,微软的com应用程序也可以通过这个机制访问基于java的对象。jcom不仅具有实现相对简单的特点,而且其最吸人的部分在于它的透明性。对java程序员来说,com对象看起来与其他java对象没有什么不同。而对com开发人员来说,远程java对象看起来就象是本机com组件。在这些对象中可以找到jcom运行时刻引擎进行动态类型映射,因此从表面上屏蔽了数据类型间的差异。远程对象的数据类型被动态地转换成调用程序所使用的基元类型。对java开发人员来说,com数据类型表现得就象java基元类型;而对com开发人员来说,java数据类型看起来就象是com数据类型。

本文将重点讨论bea的java/com解决方案。

二、jcom工作原理

jcom声称以双向方式工作,实际只是允许在java和com组件之间,在任意一个方向上通信―java对象可以调用com组件,com组件又可以调用java对象。当然,在这两种不同的分布式组件框架之间,有着两种截然不同的底层体系结构负责线路级通信。在运行时,jcom内部设置了一个双协议栈环境,实现对底层两个彼此独立的基础结构的支持(参考图1)。对于com组件,有一个在dce远程过程调用之上的com/dcom实现。对于java对象,有一个在java远程方法iiop(internet inter-orb)之上的远程方法调用(rmi)实现。调用要通过这些协议栈,并通过内部的协议转换进行处理,内部的协议转换能够有效地屏蔽掉低一级的协议。对于ejb来说,来自com客户的调用看起来就好像是来自java客户的调用。对于com组件来说,来自java客户的调用看起来就好象是来自一个普通的com客户。

jcom提供了能够自动生成更高级别com/dcom代理以及rmi存根的工具。客户程序用com/dcom代理以及rmi存根在这两个不同的基础结构间封装并传送调用。jcom可以设置成本机模式,这样就可以利用本机操作系统的动态链接库,从而减轻dcom的网络负荷,并极大地提高系统性能。

下面看一下java对象如何调用com对象:

import com.jcomsample.account.*;

clsaccount account=new clsaccount();

double accountbalance=getaccountbalance("xiao wang");

图1演示了当java对象访问com组件的时候事件产生的标准流程。首先,jcom为要访问的com组件生成―个代理对象,java对象开始调用这个代理对象。然后,代理对象与jcom运行时引擎通信,jcom运行时引擎又把代理对象的消息封装成远程过程调用的com/dcom形式,通过tcp/ip发送到windows环境里的com组件。在最低的一层上,jcom使用服务器上的标准java网络类进行调用。

基于jcom搭建java-微软信息桥梁(上)

点击查看大图


图1.jcom运行时刻环境 点击看原图

三、使用jcom工具

在实际开发中,除了使用weblogic中的一些配置外,多数情况下还需要使用jcom提供的工具程序。这些程序是jcom的核心,在不同平台间公开对象时,要用这些工具建立、部署所需要的元素。其中,常用的有:com2java、java2com、regjvm、regtlb等。篇幅所限,在此仅介绍后面示例中直接用到的com2java。

com2java的作用是,建立访问com组件所需要的java代理代码模块。

所有的com对象都有与其相关的类型库,类型库可以独立存在,或者在其它文件里,它们定义组件所包含的接口和类。不过,要找到和一个组件相关的类型库并不太容易。这是因为,类型库(扩展名为.tlb或.olb,代表类型库)有可能包含在其它文件里,比如dll文件里,而在visual basic里,类型库则保存在应用程序可执行文件自身中。

找到需要公开出来的com组件所在的类型库之后,要把它交给com2java处理,让com2java生成对应的java类,供java客户一端使用。com2java会扫描类型库,寻找它能找到的所有枚举、com接口以及com类。

下面我们看一下com2java根据类型库里找到的内容为com建立的类。

对于从类型库中找到的每个枚举,会建立一个java接口,里面包含常量声明,每个常量对应枚举中的一个项目。对于从类型库中找到的每个com类,会建立一个对应的java类,类名称与com类相同。这些类是客户程序通常要调用的类。

com2java会为从类型库里找到的每个接口建立java接口和java类。生成的java接口的名称与com接口的名称相同,java类的名称也与com接口的名称相同,只是在类名称最后加上proxy这个后缀,表示这是一个代理类。例如,如果有一个com接口,名字是windowshelper,那么生成的java接口名称就是windowshelper,而实现类(实现这个接口)的名称就是windowshelperproxy。可以想象,生成的java接口能把com接口映射成java可以识别的格式,而生成的对应的java代理类可以访问实现这个com接口的com对象。

其实,除了前面介绍的功能之外,com组件也可以通过com2java生成的java类访问实现这个接口的java对象中的方法。com2java的这种用途是com2java的特殊用法。

com2java既有gui版本,也有命令行版本。可以在\bea\webloogic81\server\bin目录下找到com2java.exe(gui版本)和com2javacmd.exe(命令行版本)。

扫描关注微信公众号