[OpenSource]浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发。目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个主要阵营,所以Java.和Net之间的整合是大型应用开发过程中经常会面临一个问题。
目前Java和.Net之间的整合主要有三种思路和做法(经过几天的查阅,目前我就看到了这三种方式,可能还有其他的方法):
1)基于通讯协议的整合
基于通讯协议的整合方式,最容易被人首先想到,简单的方式可以通过Web Service来实现,但是效率问题,在某些场合之下将会成为一个致命伤。使用Remote进行分布式开发,可以提高通信的效率,好消息是:Java和.Net都很好的支持Remoting远程对象调用的分布式开发;坏消息是:他们同时存在一个弊端,那就是对开发语言的限制,无论是使用哪一种通讯方式,服务器与客户端都必须支持同一种开发语言。对此,各大开发公司做出了积极的贡献,开发出如J-Integra(又名Ja.NET),IIOP.NET(Internet Inter-Orb Protocol),JNBridge等集成开发工具,对.NET与JAVA之间实现Remote远程对象的相互调用作出足够的支持。在这些产品中推荐选用:JNBridge
JNBridge是一种领先的JAVA与.NET互操作的的产品,凭借JNBridge技术,Java和.NET代码无需交叉编译器就可以实现对象共享。所有Java代码运行在JVM上,而.NET代码则运行在CLR上。在该方案下,JVM和CLR可以运行在不同的机器上,也可以运行在一台机器的不同进程上,甚至还能运行在相同的进程的不同应用程序域上。经历多年的发展,JNBridge已经发布了JNBridgePro 5.0,JNBridgePro 5.0有着更强大的功能。
1.支持ava和.NET之间的跨平台事务;
2.支持Microsoft Visual Studio和Eclipse插件;
3.兼容Windows 7;
4.跨平台交易一体化主要是对用户透明;
5.'回滚'- 任何一方的终止都将导致双方的行动被回滚;
JNBridge支持.NET To Java ,Java To .NET两种服务方式,并可以行用TCP、HTTP、SOAP等多个协议进行双方通讯。
参考资源:
官网地址:
2)基于用.Net实现Java虚机的整合
目前可以选用的开源资源主要是:IKVM.NET。
IKVM.NET的是开源的基于.NET CLR 的Java虚拟机。基于.NET的Java虚拟机意味着我们可以让Java程序跑在.NET上,可以通过虚拟机这个中介让Java程序和.NET应用程序一起协同工作。更难能可贵的是,IKVM同时支持微软的.NET Framework 和 Mono。
安全性是IKVM平台的一个大遗漏。此问题将依靠.NET平台提供的旧有的、但功能强大的安全模式而被解决。 虽然这样,目前项目已具备能成功运行大型java项目的能力。
IKVM目前不成熟的地方在以下几个方面:
1.对AWT和Swing没有提供支持,在IKVM的开发计划中,这项优先级别不高。
2.对Java的安全模型没有实现。
参考资源:
《Using Java Classes in your .NET Application》
http://www.codeproject.com/Articles/13549/Using-Java-Classes-in-your-NET-Application
3)基于java的本地接口的整合
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。
参考资源:
《Using the Java Native Interface in C#》
http://www.codeproject.com/Articles/245622/Using-the-Java-Native-Interface-in-Csharp
综述
选用JNBride,比较适合大型项目的开发,在双方互调上支持的非常好,而且双方可以互相不用感知。但是不管怎么样,信息传输上需要一定的开销(如果对于效率要求非常高的情况下,这方面多少有些损失)。
选用IKVM.NET,在.Net调用Java上可以做到“无缝”,如果不考虑Java调.Net(好像Java调用.Net的Dll没有.Net Call Java那么麻烦),个人感觉一般情况下还是首选(毕竟它目前的不足,一般的情况下影响不是太大,也很少有机会涉及到)。
基于JNI的整合方式,由于对Java不太了解,不好过多评论,不过曾看到一句这样的描述:使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。不管怎么样,从别人文章的描诉:“In my example, I will show you how to call a couple of Java methods from a C# client.”,可以看出从实现上,完全可以做到.Net调用Java方法。
以上的综述,均为个人浅显的理解,这几天仅仅从全局上考虑如何“Call Java Method From .Net”,对于这三种方式的Demo并没有按照别人的介绍去调试和性能测试,仅仅先从大的方向和思路上做一些前期研究。下一步,打算把1,2种方式的Demo进一步研究和比较一下,第3种方式,目前暂时定性位了解吧。
[OpenSource]浅谈.Net和Java互相调用的三种方式的更多相关文章
- 浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...
- 【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
- SpringBoot2.0.2 Application调用的三种方式
一.注解 @SpringBootApplication 点开查看源码是由多个注解合成的注解,其中主要的注解有: @SpringBootConfigurati ...
- java创建线程的三种方式及其对比
第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...
- Struts2方法调用的三种方式(有新的!调用方法的说明)
在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...
随机推荐
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- TreeSet集合
TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...
- mysql 的rmp安装
新文档/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nicolas Hery - http:// ...
- apache 工作模式
apache三种工作模式: prefork(2.4前默认)/worker/event(2.4默认)内容整理来自以下网站http://m.blog.csdn.net/article/details?id ...
- 手动将MySQL服务安装到windows中
我的系统是win7 x64,mysql版本5.6 (网上的老教程很多都没用了,版本太旧,这是我自己总结出来的方法) 下载zip包的mysql可以获得最新版本,还可以免安装,好处多多,但是要把mysql ...
- 虚拟内存设备驱动memdev及实例代码
驱动: #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #incl ...
- [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程
简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...
- 【prism】前期准备
在网上下了prism框架源码,目前最新版本为4.1,其中包含的内容如下: 其中包含三类文件: 1.类似于Desktop only-Prism Library.bat的批处理文件,用来打开相应的Pris ...
- 【WPF】路由事件
总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...
- C++ union 公共体
union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =; a.u.y =; a.u.z =; a. ...