python调用java方法_python中调用java代码

简介:Python 作为一种灵活的软件开发语言在当今被广泛使用。在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的。因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的。 JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,从而扩充 Python 语言的能力,弥补 Python 语言的不足。 本文介绍了如何利用 JPype 整合 Python 程序和 Java 程序的一些基本方法。

概览:

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

首先安装的jdk和python和第三方包jpype都是32位或者是64位。

前提条件:jdk和python都已经安装完毕

python中操作虚拟机的相关方法:

启动 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

jpype.startJVM() 的用法示例

importjpype

jvmPath=jpype.getDefaultJVMPath()

jvmArg= “ -Xint ”

jpype.startJVM(jvmPath,jvmArg)

判断 JVM 是否启动

JPype 提供的 jpype.isJVMStarted() 函数的作用是判断 JVM 是否已启动。

jpype.isJVMStarted() 的定义

isJVMStarted()

jpype.isJVMStarted() 的返回值

返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动

#jpype.isJVMStarted() 的用法示例

importjpype

jvmPath=jpype.getDefaultJVMPath()

jvmArg= “ -Xint ”if notjpype.isJVMStarted():

jpype.startJVM(jvmPath,jvmArg)

关闭 JVM

当使用完 JVM 后,可以通过 jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。

调用方式一: 直接在python代码中写java代码,调用java的api

下面是一个简单的 python 程序,通过 JPype 调用 Java 的打印函数,打印出字符串。

importjpype

jvmPath=jpype.getDefaultJVMPath()

jpype.startJVM(jvmPath)

jpype.java.lang.System.out.println( “ hello world! ” )

jpype.shutdownJVM()

调用方式二:调用java的类文件(.class文件)

下面我们用一个简单的应用实例来说明如何在 python 代码中调用 Java 类。

假设我们已用 Java 语言编写了一个类:PasswordCipher,该类的功能是对字符串进行加密和解密。它提供了一个对外的接口 run() 函数,定义如下 :

public classPasswordCipher {

……public staticString run(String action, String para){

……

}

……

}

run 函数接收两个参数,第一个参数代表所要进行的操作,传入“ encrypt ”表示对第二个参数 para 做加密操作,返回加密结果。如果第一个参数为“ decrypt ”则返回对 para 的解密操作的结果。在 run 函数中有可能会有异常抛出。

我们先将 PasswordCipher.class 存放在目录“ F:\test\cipher ”下,然后用 python 语言编写下面的代码:

Python 代码

importjpype

from jpypeimportJavaException

jvmPath=jpype.getDefaultJVMPath() #the path of jvm.dll

classpath= "F:\\test\\cipher" #the path of PasswordCipher.classjvmArg= "-Djava.class.path=" +classpathifnot 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 JavaclassencryptedString= javaClass.run("encrypt", testString)

print"encrypted string is : ", encryptedString

#call the run function of JavaclassdecryptedString= 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

运行该程序后得到的结果:

original string is: congratulations

encrypted stringis : B0CL+niNYwJLgx/9tisAcQ==decryped stringis : congratulations

调用方式三:调用第三方的jar包

step 1 安装jpype

pip install jpype1

step 2 编写java代码

packagemainpro;public classHello {public voidsh(){

System.out.println("I am sh method");

}public static voidshow() {

System.out.println("I am show() method");

}public static voidmain(String[] args) {

System.out.println("hello , I am coming");

Hello.show();

Hello hello= newHello();

hello.sh();

}

}

step 3 打jar包

jartest.jar

step 4 开发python程序

#-*- coding: utf-8 -*-

importjpypeimportosif __name__ == '__main__':"""基本的开发流程如下:

①、使用jpype开启jvm

②、加载java类

③、调用java方法

④、关闭jvm(不是真正意义上的关闭,卸载之前加载的类)"""

#①、使用jpype开启虚拟机(在开启jvm之前要加载类路径)

#加载刚才打包的jar文件

jarpath = os.path.join(os.path.abspath('.'),'D:/tmp/jartest.jar')#获取jvm.dll的文件路径

jvmPath =jpype.getDefaultJVMPath()#开启jvm

jpype.startJVM(jvmPath,'-ea','-Djava.class.path=%s' %(jarpath))#加载java类(参数名是java的长类名)

javaClass = jpype.JClass('mainpro.Hello')#实例化java对象

javaInstance =javaClass()#实例化调用方法

javaInstance.sh()#诗经用类调用静态方法

javaClass.show()#不能直接调用main方法!!!!!!!??

#javaClass.main()

#关闭jvm

jpype.shutdownJVM()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值