JPype 是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。
JPype 的使用
一个简单的 hello world 程序
下面是一个简单的 python 程序,通过 JPype 调用 Java 的打印函数,打印出字符串。
1. hello world

import jpype
jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println( “ hello world! ” )
jpype.shutdownJVM()

启动 JVM
JPype 提供的 startJVM() 函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。
jpype.startJVM() 的定义

startJVM(jvm, *args)
jpype.startJVM() 的参数
参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\Program Files\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。
参数 2: args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:

-agentlib:libname[=options]
-classpath classpath
-verbose
-Xint
2. jpype.startJVM() 的用法示例

import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -Xint ”
jpype.startJVM(jvmPath,jvmArg)
判断 JVM 是否启动
JPype 提供的 jpype.isJVMStarted() 函数的作用是判断 JVM 是否已启动。
jpype.isJVMStarted() 的定义
isJVMStarted()
jpype.isJVMStarted() 的返回值
返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动
3. jpype.isJVMStarted() 的用法示例

import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -Xint ”
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath,jvmArg)

关闭 JVM
当使用完 JVM 后,可以通过 jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。
引用第三方的 Java 扩展包
很多时候,在 python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。为了使编程者方便地在 python 代码中调用已有的 Java 扩展包,我们可以再在 JVM 启动参数增加:
-Djava.class.path=ext_classpath
以下为调用第三方 Java 扩展包示例,(假设第三方 Java 扩展包的所在路径是 E:\JavaExt)
4. 调用第三方 Java 扩展包示例

import jpype
jvmPath = jpype.getDefaultJVMPath()
ext_classpath = “ E:\\JavaExt ”
jvmArg = “ -Djava.class.path = ” + ext_classpath
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath, jvmArg)
访问 Java 的系统属性
有时,某些 Java 应用需要设置或者获取 JVM 中的系统属性。
在 JVM 启动时设置系统变量示例:
在 JVM 的启动参数中加入如下参数:
-Dproperty=value
假设你要设置的属性名为 yourProperty,属性值为 yourValue 。
5. JVM 启动时设置系统变量示例

import jpype
jvmPath = jpype.getDefaultJVMPath()
jvmArg = “ -DyourProperty=yourValue ”
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath,jvmArg)
6. 在程序中设置系统变量示例

import jpype
prop = “ yourProperty ”
value = “ yourValue ”
system = jpype.JClass('java.lang.System')
system.setProperty(str(prop),str(value))
7. 在程序中获取系统变量示例

import jpype
prop = “ yourProperty ”
system = jpype.JClass('java.lang.System')
value = system.getProperty(str(prop))

1. Java 类型到 python 类型的转换
Java 类型 转换成的 python 类型
byte, short and int int
long long
float and double float
boolean int of value 1 or 0
char unicode of length 1
String unicode
arrays JArray
other Java object JavaObject
Class JavaClass
array Class JavaArrayClass
使用 Java 对象
8. Java 类定义

package src.com.ibm.javaproject;

public class JavaClass {
public String value = "";

/**
* Creates a new JavaClass object.
*
* @param value
*/
public JavaClass(String value) {
this.value = value;
}

public String getValue() {
return this.value;
}

public void setValue(String val) {
this.value = val;
}
}
对于上述的 Java 类,以下的代码介绍了如何在 Python 中构造并且使用相应的对象。 首先是获得对应 Java 类:
9. 获得对应 Java 类

import jpype
javaClass = jpype.JClass('src.com.ibm.javaproject.JavaClass')
调用 Java 类的构造函数生成实例:
10. 调用 Java 类的构造函数生成实例

value = “ oldvalue ”
javaInstance = javaClass(value)
调用 Java 方法:
11. 调用 Java 方法

print javaInstance.getValue()
javaInstance.setValue( “ newvalue ” )
print javaInstance.getValue()
运行结果:
12. Python 代码的运行结果

oldvalue
newvalue
Java exception 错误处理
异常处理是程序编写者们必须考虑的问题,在使用 JPype 的过程中,所有的 Java exception 将被自动转换成 jpype.JavaException 。 以下是 Jpype 处理 Java exception 的示例:
13. 处理 Java exception

from jpype import JavaException
try:
#Code that throws a java.lang.RuntimeException
except JavaException, ex:
if JavaException.javaClass() is java.lang.RuntimeException:
print "Caught the runtime exception : ", JavaException.message()
print JavaException.stackTrace()
应用实例(Password Cipher)
下面我们用一个简单的应用实例来说明如何在 python 代码中调用 Java 类。
Java 类定义
假设我们已用 Java 语言编写了一个类:PasswordCipher,该类的功能是对字符串进行加密和解密。它提供了一个对外的接口 run() 函数,定义如下 :
14. PasswordCipher 定义

public class PasswordCipher {
……
public static String run(String action, String para){
……
}
……
}
run 函数接收两个参数,第一个参数代表所要进行的操作,传入“ encrypt ”表示对第二个参数 para 做加密操作,返回加密结果。如果第一个参数为“ decrypt ”则返回对 para 的解密操作的结果。在 run 函数中有可能会有异常抛出。
Python 代码
我们先将 PasswordCipher.class 存放在目录“ F:\test\cipher ”下,然后用 python 语言编写下面的代码:
15. Python 代码

import jpype
from jpype import JavaException

jvmPath = jpype.getDefaultJVMPath() #the path of jvm.dll
classpath = "F:\\test\\cipher" #the path of PasswordCipher.class
jvmArg = "-Djava.class.path=" + classpath
if not jpype.isJVMStarted(): #test whether the JVM is started
jpype.startJVM(jvmPath,jvmArg) #start JVM
javaClass = jpype.JClass("PasswordCipher") #create the Java class
try:
testString = "congratulations"
print "original string is : ", testString
#call the run function of Java class
encryptedString = javaClass.run("encrypt", testString)
print "encrypted string is : ", encryptedString

#call the run function of Java class

decryptedString = javaClass.run("decrypt", encryptedString)
print "decryped string is : ", decryptedString
except JavaException, ex:
print "Caught exception : ", JavaException.message()
print JavaException.stackTrace()
except:
print "Unknown Error"
finally:
jpype.shutdownJVM() #shut down JVM
运行该程序后得到的结果:
16. 该程序运行的结果是:

original string is : congratulations
encrypted string is : B0CL+niNYwJLgx/9tisAcQ==
decryped string is : congratulations

python调用java--JPype的更多相关文章

  1. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  2. Python调用Java(基于Ubuntu 18.04)

    最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...

  3. python调用java程序--jpype

    官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...

  4. 使用 jpype 库实现 Python 调用 java 的 jar 包中的功能

    一.what's the JPype JPype 是一个能够让 python 代码方便地调用 Java 代码的工具.在某些时候 java 的能力更强,我们可以用 java 写一个模块的功能然后用 Py ...

  5. python - jpype模块,python调用java的接口

    转载自: http://www.cnblogs.com/junrong624/p/5278457.html https://www.cnblogs.com/fanghao/p/7745356.html ...

  6. python 调用 java代码

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  7. python调用java API

    JPype documentation JPype is an effort to allow python programs full access to java class libraries. ...

  8. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  9. python 调用java脚本的加密(没试过,先记录在此)

    http://lemfix.com/topics/344 前言 自动化测试应用越来越多了,尤其是接口自动化测试. 在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理. 而目前为主,大部分公 ...

  10. python调用java代码 java虚拟机(jvm)

    1.新建com文件夹,在里面新建 fibnq.java package com; public class fibnq { public fibnq(){} public int fb(int n){ ...

随机推荐

  1. [雅礼NOIP2018集训 day4]

    感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...

  2. 利用@keyframe及animation做一个页面Loading时的小动画

    前言 利用@keyframe规则和animation常用属性做一个页面Loading时的小动画. 1  @keyframe规则简介 @keyframes定义关键帧,即动画每一帧执行什么. 要使用关键帧 ...

  3. Servlet学习(三)——实例:用户登录并记录登陆次数

    1.前提:在Mysql数据库下建立数据库web13,在web13下创建一张表user,插入几条数据如下: 2.创建HTML文件,命名为login,作为登录界面(以post方式提交) <!DOCT ...

  4. oralce模糊查询之含有通配符

    oracle中通配符有 '_'和'%'当like  '_ww%'时,会把'_'和'%'当作通配符使用导致查不出含有'_'和'%'的数据.这时用到转译字符 like '\_ww\%' escape '\ ...

  5. 对同层数据进行处理,做成树状图形式的数据结构,并符合elementui中的tree结构

    //通过子级的pid找到父级对应的id,制作树状图 var data = [ { id: 1, name: "办公管理", pid: 0 }, { id: 2, name: &qu ...

  6. JavaScript函数练习

    1. 判断一个数是否是素数 function isSushu (n) { n = n || 0; var isSu = true; for (var i = 2; i <= Math.sqrt( ...

  7. luogu P3795 钟氏映射(递推)

    题意 n<=107 20MB 题解 也就是给n个点,把他们一个分为一组,或两个分为一组,有多少种方法. 空间大点随便做. 我们靠递推. 一个新点,要不自己一组,要不和前面的一个点构成一组. 所以 ...

  8. 获取mapper

    static UpdateLogMapper updateLogMapper = (UpdateLogMapper)SpringContextUtil.getBean(UpdateLogMapper. ...

  9. libcudnn (R5) not found in library path

    环境:Ubuntu 18.04 +  Torch7 + cuda10 在运行使用cudnn的lua程序的时候产生错误: /home/majiabiao/torch/: /home/majiabiao/ ...

  10. 升级glibc的感慨,

    1. 直接升级 glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服务 ...