本文将重点讨论BEA的Java/COM解决方案,是全文的第一部分,细致分析BEA提供的Java/COM互操作解决方案—jCOM的实现原理。

一、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网络类进行调用。

 
图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(命令行版本)。

转载 http://expert.51cto.com/art/200604/25856.htm

基于jCOM搭建Java-微软信息桥梁(上)的更多相关文章

  1. 基于jCOM搭建Java-微软信息桥梁(下)

    第一部分析了BEA提供的Java/COM互操作解决方案—jCOM的实现原理:本文是第二部分,比较全面地分析了Weblogic Server的jCOM实现技术之后,通过一个具体实例来说明了jCOM的具体 ...

  2. Docker学习笔记之二,基于Dockerfile搭建JAVA Tomcat运行环境

    前言 在第一篇文字中,我们完全人工方式,一个命令一个命令输入,实现一个 java tomcat运行环境,虽然也初见成效,但很累人.如果依靠依靠脚本构建一个Tomcat容器实例,一个命令可以搞定,何乐而 ...

  3. 基于Dockerfile搭建JAVA Tomcat运行环境

    前言 在第一篇文字中,我们完全人工方式,一个命令一个命令输入,实现一个java tomcat运行环境,虽然也初见成效,但很累人.如果依靠依靠脚本构建一个Tomcat容器实例,一个命令可以搞定,何乐而不 ...

  4. 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统

    王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...

  5. 珠联壁合地设天造|M1 Mac os(Apple Silicon)基于vscode(arm64)配置搭建Java开发环境(集成web框架Springboot)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_194 也许有人从未听说过Python,但是不会有人没听说过Java,它作为一个拥有悠久历史的老牌编程语言,常年雄踞TIOBE编程语 ...

  6. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  7. Java之基于Eclipse搭建SSH框架(下)

    在上篇博客里,我简介了Tomcat滴配置与Struts2滴搭建,假设对这个还不会滴童鞋去看一下我滴上篇博客<Java之基于Eclipse搭建SSH框架(上)>.今天我们接着上篇博客滴内容. ...

  8. 基于ECS搭建云上博客

    场景介绍 本文为您介绍如何基于ECS搭建云上博客. 背景知识 本场景主要涉及以下云产品和服务: 云服务器ECS 云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能 ...

  9. ubuntu上用eclipse搭建java、python开发环境

    上一篇文章讲到如何在windwos上用eclipse搭建java.python开发环境,这一讲将关注如何在ubuntu上实现搭建,本人使用虚拟机安装的ubuntu系统,系统版本为:14.04 lts ...

随机推荐

  1. XiaoMi Interview Log

    面试题目 PHP 弱类型 实现? COW 写时复制 实现? COW的时候内存的变化 12 $a = $b = 1;$b = 2; 的内存变化 ? 提供一个rand()函数[函数输出0 - 正无穷] 想 ...

  2. 在Linux中安装Oracle(较详细图解)

    原创 http://www.cnblogs.com/nucdy/p/5603998.html 参考视屏:链接: https://pan.baidu.com/s/1kViEZQZ  密码: z7ha ( ...

  3. bzoj 4069~4071 APIO2015

    T1 从高到底按位确定答案 A=1时f[i]表示前i个数合法的划分至少需要分出几段,时间复杂度$O(n^2log(ans))$ A>1时f[i][j]表示前i个数划分为j段是否可能合法,转移显然 ...

  4. Java 字符串拼接 StringBuilder() StringBuffer

            字符串拼接 普通方式 public class StringDemo2 { public static void main(String[] args) { // 表示获取从1970- ...

  5. Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行 ...

  6. json中key大小写转换

    最近工作中遇到json格式的字符串中的key为大写的,需要转换成小写的来解析,开始想使用正则来替换,结果不是很方便,后来考虑把JSONObject重新来封装. 如下json格式:{PWACHECKIN ...

  7. 两个很经典的拓扑排序题目POJ3687+HDU1285

    一.题目链接 POJ:http://poj.org/problem?id=3687 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1285 二.思路 这两 ...

  8. redis for windows之nosql还需要入门?

    RT:nosql给很多人的感觉就是上手特别快,本文也是一篇入门级的,哎~~ 又写了一篇没有卵用的博文,姑且把它当作一篇文档吧,还是没有发布/订阅.事件...等介绍的一篇残缺文档,幸好废话不是很多,凑合 ...

  9. HTML5按比例缩略图片并上传的实例

    <!DOCTYPE HTML PUBLIC> <html> <head> <meta charset="utf-8"> <sc ...

  10. python实现进度条--主要用在上传下载文件

    在python中进行socket上传文件的时候使用进度条,然后在网上找了好久,找寻相关的进度的条的使用,看了几个,发现总是无法进行调用,主要原因是在进行上传文件的时候,每次传送的数据量是固定的,数据的 ...