浅谈.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等多个协议进行双方通讯。

参考资源:

官网地址:

http://www.jnbridge.com

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种方式,目前暂时定性位了解吧。

时间: 2025-01-05 14:59:31

浅谈.Net和Java互相调用的三种方式的相关文章

[OpenSource]浅谈.Net和Java互相调用的三种方式

在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个主要阵营,所以Java.和Net之间的整合是大型应用开发过程中经常会面临一个问题. 目前Java和.Net之间的整合主要有三种思路和做法(经过几天的查阅,目前我就看到了这三种方式,可能还有其他的方法): 1)基于通讯协议的整合 基于通讯协议的整合方式,最容易被人首先想到,简单的方式可以通过Web S

【转】【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式

ASP.NET MVC系列文章 原文地址:https://www.cnblogs.com/wangjiming/p/6275854.html [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP.NET框架 [05]浅谈ASP.NET MVC运行过程 [06]浅谈ASP.NET MVC 控制器 [07]浅谈ASP.NET MVC 路由 [08]浅谈AS

Java实现线程的三种方式和区别

Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以: 使用后两种方式可以多个线程共享一个target: Callable比Runnable多一个返回值,并且call()方法可以抛出异常: 访问线程名,第一种直接使用this.getName(),后两种使用Thread.currentThread().getName(). 下面我们通过代码来看一下实现

java多线程开启的三种方式

1.继承Thread类,新建一个当前类对象,并且运行其start()方法 1 package com.xiaostudy.thread; 2 3 /** 4 * @desc 第一种开启线程的方式 5 * @author xiaostudy 6 * 7 */ 8 public class Demo1_Thread extends Thread { 9 10 public void run() { 11 for (int i = 0; i < 10; i++) { 12 System.out.pri

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

SpringBoot2.0.2 Application调用的三种方式

一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfiguration            @EnableAutoConfiguration            @ComponentScan 三个关键的注解:             @ComponentScan 自动扫描加载进来的包,-----------可以扫描自动加载的bean            @E

java数组扩增的三种方式

java数组声明的时候必须声明其长度,但当我们想对数组进行扩增的时候该怎么办呢? 下面三种方式都可以进行扩增,最后一种也最为方便. 1 /** 2 * 手动循环扩增 3 */ 4 int[] arr = { 1, 2, 3 }; 5 int[] tempArray = new int[arr.length * 2]; 6 for (int i = 0; i < arr.length; i++) { 7 tempArray[i] = arr[i]; 8 } 9 //tempArray = { 1,

java实现多线程的三种方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1.继承Thread类,重写父类run()方法   public class thread1 extends Thread {           public void run() {                 for (int i = 0; i < 10000; i++) {                         System.out.println("我是线程"+this.get