python调用Java-JPype使用介绍(二)(转)

本文介绍如何利用JPype库实现Python与Java类之间的交互,包括类的构造、方法调用及异常处理,并通过PasswordCipher实例展示具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

清单 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


参考资料

访问 JPype 的主页,了解更多 JPype 的内容。
访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
有关 Python 更多信息,请参考 developerWorks 上 Linux 专区的 Python 专题。


作者简介



任亮,IBM 中国系统与技术实验室,软件工程师,2004 年获得上海交通大学计算机学士学位并于 2008 年加入 IBM,目前主要从事 IBM 系统管理软件的研发。周怿,IBM 中国系统与技术实验室,软件工程师,2006 年获得浙江大学计算机硕士学位并于 2007 年加入 IBM,目前主要从事 IBM 系统管理软件的研发。



周怿,IBM 中国系统与技术实验室,软件工程师,2006 年获得浙江大学计算机硕士学位并于 2007 年加入 IBM,目前主要从事 IBM 系统管理软件的研发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值