1.RMI
- RMI:Remote Method Invocation 远程方法调用
- 两个位于不同JVM虚拟机的Java程序互相请求访问
RMI的参数和返回值
- (自动化) 传递远程对象(实现Remote接口)
- 当一个对远程对象的引用从一个JVM传递到另一个JVM,该远程对象的发送者和接收者将持有同一个实体对象的引用。这个引用并非是一个内存位置,而是由网络地址和该远程对象的唯一标识符构成的。
###两个JVM拥有同一个对象###
- 当一个对远程对象的引用从一个JVM传递到另一个JVM,该远程对象的发送者和接收者将持有同一个实体对象的引用。这个引用并非是一个内存位置,而是由网络地址和该远程对象的唯一标识符构成的。
- (自动化) 传递可序列化对象(实现Serializable接口)
- JVM中的一个对象经过序列化后的字节,通过网络,其副本传递到另一个JVM中,并重新还原为一个Java对象。
###每个JVM拥有自己的对象###
- JVM中的一个对象经过序列化后的字节,通过网络,其副本传递到另一个JVM中,并重新还原为一个Java对象。
1 | //Client |
- RMI优点
- 跨平台分布式对象调用
- 完全对象支持
- 安全策略
- RMI缺点
- 双方必须是Java语言实现
- 不如消息传递协作方便
2.JNI
- JNI,Java Native Interface
- Java和本地C代码进行互操作
- Java调用C程序完成一些需要快速计算的功能(常见,重点)
- C调用Java程序(基于反射的方法)
基本步骤
- 在Java类中声明一个本地方法,使用native函数
1 | class HelloNative { |
- 调用javac.exe编译,得到HelloNative.class
- 调用javah.exe得到包含该方法(Java_HelloNative_greeting)的头文件HelloNative.h
- 实现.c文件(对应HelloNative.h)
1 |
|
- 将.c和.h文件,整合为共享库(DLL)文件
- 在Java类中,加载相应的共享库文件
1 | HelloNative.greeting(); |
3.Nashorn
- 脚本引擎,ScriptEngine
- Nashorn,JDK 8自带的JS解释器(JDK6/7是Rhino解释器)
1 | ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”) |
- 主要方法
- eval,执行一段js脚本. eval(String str), eval(Reader reader)
- put,设置一个变量
- get,获取一个变量
- createBindings, 创建一个Bindings
- setBindings, 设置脚本变量使用的范围
1 | //Test1 |
JDK支持的脚本引擎工厂
引擎 | 名字 | MIME类型 | 文件扩展 |
---|---|---|---|
Nashorn | nashorn,js | text/javascript | js |
Groovy | groovy | 无 | groovy |
Renjin | Renjin | text/x-R | R,r,S,s |
SISC Scheme | sisc | 无 | scheme,sisc |
4.Jython
- Jython是Python语言在Java平台的实现
- Jython是在JVM上实现的Python,由Java编写
- Jython将Python源码编译成JVM字节码,由JVM执行对应的字节码,因此能很好的与JVM集成
- Jython并不是Java和Python的连接器
关键类
- PythonInterpreter
- exec 执行语句
- set 设置变量值
- get 获取变量值
- execfile执行一个python文件
- PyObject
- PyFunction
1 | // 执行Python程序语句 |
5.Web Service
- 由万维网联盟(W3C, World Wide Web Consortium)提出
- 消除语言差异、平台差异、协议差异和数据结构差异,成为不同构件模型和异构系统之间的集成技术
- Web Service是为实现跨网络操作而设计的软件系统,提供了相关的操作接口,其他应用可以使用SOAP消息,以预先指定的方式来与Web Service进行交互
wsimport 工具
- %JAVA_HOME%\bin目录下
- 根据wsdl文档,自动产生客户端中间代码
1 | wsimport -keep -verbose http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL |
基本步骤
- 调用wsimport所产生客户端中间代码
- 提供相应参数
- 获取返回结果
1 | /** |
- Java 调用 Web Service 其他办法
- Axis/Axis2 (axis.apache.org)
- 采用URLConnection访问 Web Service
- 采用HttpClient访问Web Service
6.命令行
Runtime
- Java提供Runtime类
- exec 以一个独立进程执行命令command, 并返回Process句柄
- 当独立进程启动后,需要处理该进程的输出流/错误流
- 调用Process.getInputStream 可以获取进程的输出流
- 调用Process.getErrorStream可以获取进程的错误输出流
- 调用Process.waitFor 等待目标进程的终止(当前进程阻塞)
1 | Process p; |