如何用Python调用java程序
时间:2022-05-07
本文章向大家介绍如何用Python调用java程序,主要内容包括前言、JPype简述、安装、调用标准代码、调用自定义代码、官方手册、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
如何用Python调用java程序
前言
不会java怎么做Java程序的单元测试呢?我想有一种很好的选择就是Python,充分利用Python的胶水语言的特性,你可以做任何语言的单元测试。
当然用Python调用Java有多种方式,本文只介绍一种方式,其他方式请自行查资料学习。
JPype简述
JPype是一个能够让Python代码方便地调用Java代码的库,所以你只需掌握JPype库即可做Java程序的单元测试了。
安装
先安装Python和JDK,然后使用如下命令,安装JPype:
pip install jpype1
安装成功如下图:
调用标准代码
下面演示使用JPype调用Java标准的println函数试试:
# -*- coding:utf-8 -*-
__author__ = "苦叶子"
"""
关注微信公众号:开源优测
获取更多关于开源技术在测试工作中的应用实践
"""
from jpype import *
if __name__ == "__main__":
# 启动java虚拟机
startJVM(getDefaultJVMPath(), "-ea")
# 调用println函数
java.lang.System.out.println("hello python java")
# 关闭虚拟机
shutdownJVM()
执行上述代码,结果如下:
调用自定义代码
下面我们演示如何使用Python JPype来调用我们自己写的Java程序:
public class JPypeDemo{
public String say(String user){
return "[开源优测]说: " + user;
}
public int calc(int a, int b){
return a + b;
}}
将上述java代码保持至JPypeDemo.java中,使用下列命令,将上述代码编译成jar文件
编译java程序
javac JPypeDemo.java
打包成jar文件
jar cvf JPypeDemo.jar JPypeDemo.class
写我们的python调用代码如下:
# -*- coding:utf-8 -*-
__author__ = "苦叶子"
"""
关注微信公众号:开源优测
获取更多关于开源技术在测试工作中的应用实践
"""
from jpype import *
import os
if __name__ == "__main__":
# 启动java虚拟机
# 注意使用了-D选项指定了jar的目标位置
startJVM(getDefaultJVMPath(), "-ea",
"-Djava.class.path=%s" % (os.getcwd() + "/JPypeDemo.jar"))
# 加载自定义的java class
JDClass = JClass("JPypeDemo")
jd = JDClass()
# 获取java标准库打印函数
jprint = java.lang.System.out.println
# 调用自定义class中的函数,并输出返回值
jprint(jd.say("deeptest"))
jprint(jd.calc(1, 4))
# 关闭虚拟机
shutdownJVM()
将上述python代码保存至python_call_java.py中,并和JPypeDemo.jar(实际操作中你可以将jar放在任意目录,只要在启动jvm时指定待调用jar的路径即可)
整个执行过程和结果如下图:
官方手册
http://jpype.readthedocs.io/en/latest/userguide.html#
- 搭建Docker私有仓库--自签名方式
- 详解JavaScript闭包
- Python多进程抓取全国邮政编码和长途区号
- [个人翻译]Redis 集群教程(下)
- [个人翻译]Redis 集群教程(中)
- 自学Apache Spark博客(节选)
- scrapy爬取免费代理IP存储到数据库构建自有IP池
- 每天一个Linux命令:netstat
- Hadoop - MapReduce
- 进击的爬虫:用Python搭建匿名代理池
- 计算机程序的思维逻辑 (5) - 小数计算为什么会出错?
- QQ空间爬虫最新分享,一天 400 万条数据
- 计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算
- Python中典型内建函数的用法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode队列之最近的请求次数
- 路由策略中的IP-Prefix你了解多少?
- Qt音视频开发29-Onvif云台控制
- 十大高性能开发
- 【云+社区年度征文】java agent及字节码技术得到DNS时间流程尝试
- 短视频商城源码,制作彩色验证码
- ubuntu下的mysql安装与使用
- 排序算法
- 并发编程框架Disruptor之高性能设计
- 3分钟短文:Laravel说要用软删除,可不要真删
- leetcode队列之设计循环双端队列
- MySQL8.0的binlog详解
- Flutter NestedScrollView实现的一个经典滑动折叠头部图片的效果
- Maven 编译拷贝资源的时候提示 UTF-8 编码信息
- Qt音视频开发30-Onvif事件订阅