python调用Java-JPype使用介绍(二)(转)
清单 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 系统管理软件的研发。