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. angular与angularjs常用指令的不同写法整理

    angularjs与angular 常用的指令写法的区别; 一:angularjs指令 1.ng-bind 使用给定的变量或表达式的值来替换 HTML 元素的内容 <p ng-bind=&quo ...

  2. 接口、索引器、Foreach的本质(学习笔记)

    接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: public interface IEat//定义一个接口 { void Eat(string food); ...

  3. 洛谷P1067 多项式输出(模拟)

    题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 1. 多项式中 ...

  4. 搭建python3环境

    将Python2.7通过控制面板卸载,然后从网站下载python的安装包,安装即可. 安装beatifulsoup4库.在命令行下, pip install beautifulsoup4 千万不能在p ...

  5. HDU 2120 Ice_cream's world I【并查集】

    解题思路:给出n对点的关系,求构成多少个环,如果对于点x和点y,它们本身就有一堵墙,即为它们本身就相连,如果find(x)=find(y),说明它们的根节点相同,它们之间肯定有直接或间接的相连,即形成 ...

  6. java中class,public的用法

    java中class,public的用法 一.Java访问权限饰词(access specifiers) Java有public.protect.friendly.private四种访问权限,并且这四 ...

  7. 如何防止js刷新页面后倒计时改变

    1.存入cookie或localstorage(清除浏览器缓存后时间依然改变) 2.存入数据库

  8. php>$_SERVER服务的一些常用命令

    $_SERVER['REMOTE_ADDR'] //当前用户 IP . $_SERVER['REMOTE_HOST'] //当前用户主机名   $_SERVER['REQUEST_URI'] //UR ...

  9. Python爬虫简单入门及小技巧

    刚刚申请博客,内心激动万分.于是为了扩充一下分类,随便一个随笔,也为了怕忘记新学的东西由于博主十分怠惰,所以本文并不包含安装python(以及各种模块)和python语法. 目标 前几天上B站时看到一 ...

  10. python做的 QQ未读消息图像

    #!/usr/bin/pythonfrom PIL import Image ,ImageDraw, ImageFont#打开所在的文件im=Image.open('test.jpg')#获取图片对象 ...