JPype一Python调用Java代码并执行综合讲解篇

Python作为一种脚本语言,大量用于测试用例和测试代码的编写,尤其适用于交互式业务场景。实际应用中大多数方法以Java方法实现其功能,如Linux运维、客户端加解密方法等需要Python执行调用验证。Python可以作为一门胶水语言使用,可以用其它语言的优势来弥补自身如性能方面的不足,Jpype就是在Python中使用jvm的第三方库。

安装

依赖环境

Python

Java

Jpype

numpy

执行Python环境安装,其他环境请自行安装

pip install jpype1

pip install numpy

备注:如果通过命令无法完成安装,请下载对应版本的xxx.whl文件执行安装

下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

简单示例

学习编程“Hello World”走天下

Jpype程序执行顺序:

设置参数启动JAVA虚拟机

运行JAVA代码

关闭虚拟机

示例代码如下:

#!/usr/bin/env python

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

# @Author : Benjamin

# @Time : 2018/8/27 23:32

fromjpypeimport*

startJVM("C:/Java/jdk1.6.0_10/jre/bin/client/jvm.dll","-ea")

java.lang.System.out.println("hello World")

shutdownJVM()

深入示例

Python调用Java类型汇总:

直接调用Java API

调用Java 第三方 Jar 扩展包

调用Java Class文件

First Demo

使用Python直接调用Java默认API

#!/usr/bin/env python

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

# @Author : Benjamin

# @Time : 2018/8/3 16:09

# Demo 1

# 测试Python 调用 Java 代码

importjpype

# 启动JVM

jpype.startJVM("C:\code_path\java\jre\\bin\server\jvm.dll","-ea")

# 执行Java代码

jpype.java.lang.System.out.println("hello World")

# 关闭JVM

jpype.shutdownJVM()

Second Demo

使用Python调用Java第三方Jar扩展包

#!/usr/bin/env python

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

# @Author : Benjamin

# @Time : 2018/8/3 16:09

# Demo 2

# 应用第三方jar包

importjpype

# 启动JVM并加载jar包,并带入相应的库方法

jpype.startJVM("C:\code_path\java\jre\\bin\server\jvm.dll","-ea","-Djava.class.path=%s"%'C:\\Users\\Benjamin\Desktop\python\TestPro\helloworld.jar')

JDClass = jpype.JClass("org.na.HelloName")

# 实例化对象

jd = JDClass()

#两种创建jd的方法

#jd = JPackage("jpype").JpypeDemo()

# 调用java方法

jprint = jpype.java.lang.System.out.println

# 执行 Jar包字符串拼接解析方法

jprint(jd.HelloName("Benjamin"))

# 执行Jar包加法

jprint(jd.NumAdd(2,4))

# 关闭jvm

jpype.shutdownJVM()

小坑讲解:

1:public static String HelloName() 静态方法无法被调用,只能调用非静态方法

2:无法获取Java中的Print值,只能获取Return值

Third Demo

使用Python调用Java Class文件(Class文件带Package目录信息)

#!/usr/bin/env python

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

# @Author : Benjamin

# @Time : 2018/8/3 16:09

# Demo 3

# 调用带路径同目录输出的java class文件

# java文件中带package信息,获取eclipse的编译文件必须带路径访问

importjpype

# 启动JVM

jpype.startJVM("C:\code_path\java\jre\\bin\server\jvm.dll","-ea")

# 添加指定class文件

JDClass = jpype.JClass("org.na.HelloName")

# 实例化对象

javaInstance = JDClass()

# 调用JAVA对象的方法,Python方法混用

print(javaInstance.HelloName("Benjamin"))

# 调用java calc 方法并赋值

NumAdd = javaInstance.NumAdd(3,4)

print(NumAdd)

# 关闭jvm

jpype.shutdownJVM()

Third Demo Pro

使用Python调用Java Class文件(Class文件不带Package目录信息)

#!/usr/bin/env python

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

# @Author : Benjamin

# @Time : 2018/8/3 16:09

# Demo 4

# 调用不带路径同目录输出的java class文件

# java文件中不带package信息为空,编译命令为:javac HellName.java

importjpype

# 启动JVM

jpype.startJVM("C:\code_path\java\jre\\bin\server\jvm.dll","-ea")

# 添加指定class文件

JDClass = jpype.JClass("HelloName")

# 实例化对象

javaInstance = JDClass()

# 调用JAVA对象的方法,并与Python方法混用

print(javaInstance.HelloName("Benjamin"))

# 调用java calc方法,并赋值给指定名称

NumAdd= javaInstance.NumAdd(3,4)

print(NumAdd)

# 关闭jvm

jpype.shutdownJVM()

总结

Jpype提供了强大而灵活的Java虚拟机接口,使得Python的扩展性进一步提升,Python的优雅语法,配上Java的工程化性能,可以使测试开发更加高效。

赠言

“人与动物最本质的区别在于人能制造和使用工具"

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180828G01QMP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券