python调用java之Jpype实现java接口
python实现java接口
- 概述
- java程序
- java接口
- java测试函数
- 在python中实现java接口的两种方式
- 第一种:JImplements
- JImplements的使用示例
- JImplements不友好的地方
- 第二种:JProxy
- 总结
- 示例源码
概述
本文介绍在python中实现java接口。
JPype 可以通过使用装饰器或手动创建 JProxy 来实现 Java 接口。Java 只支持代理接口,因此我们不能扩展现有的 Java 类。
笔者在测试领域,通常使用python调用java程序,达到在通过python测试java程序的目的。因此不能很理解在python中实现java接口的意义。如果有人知道,请留言告知。
了解的一个意义是:在python中实现java接口,然后作为回调函数传递给java api。
下面介绍下在java中,一个函数的参数是一个回调函数的例子。
java程序
java接口
package params;public interface testInterface {int testMethod();
}
java测试函数
该函数的第二个参数是一个实现了testInterface接口的对象,但这个接口java提供方没有实现,而是留给调用方实现。
public int test_recall(int a, testInterface a_interface_obj){int b = a_interface_obj.testMethod();return a+b;}
如果使用python调用test_recall函数,那么就需要在python中实现testInterface接口。
在python中实现java接口的两种方式
第一种:JImplements
JImplements是Jpype提供的一个装饰器对象,通过使用它来实现java接口的实现。但这个方法有个不友好的地方,下面遇到会介绍。
JImplements的使用示例
通过JImplements实现上文中的testInterface接口
# coding: utf-8
from jpype import JImplements, JOverride@JImplements("params.testInterface")
class java_interface:@JOverridedef testMethod(self):return 99
调用java程序中的test_recall函数
res = myJpypeTest.test_recall(to_int(1), java_interface())print(res)
"D:\Program Files\Python39\python.exe" D:/myProjects/python/test_JPype/main.py
100Process finished with exit code 0
我们通过使用JImplements装饰器在python中实现了testInterface接口,然后把其作为回调函数传给test_recall,完成test_recall调用。
JImplements不友好的地方
这个不友好的地方来源与python的一个知识点:
- python在导入模块时就会执行装饰器
按照笔者的编程风格,实现java接口,作为独立功能是单独放在一个python模块文件中,而调用java程序的代码放在另一个模块中。
其中java_interface.py是实现java接口的模块。
main.py是实现调用java程序的模块。
在main.py的顶部,会有from java_interface import java_interface
来导入实现java接口的类。
因为JImplements是一个装饰器,所以在加载java_interface模块时就会执行,此时业务代码没有执行,jar包没有加载,jvm没有启动,所以JImplements执行会报JVM没有启动的错误。
"D:\Program Files\Python39\python.exe" D:/myProjects/python/test_JPype/main.py
Traceback (most recent call last):File "D:\myProjects\python\test_JPype\main.py", line 5, in <module>from java_interface import java_interfaceFile "D:\myProjects\python\test_JPype\java_interface.py", line 6, in <module>class java_interface:File "D:\Program Files\Python39\lib\site-packages\jpype\_jproxy.py", line 136, in JProxyCreatorreturn _createJProxy(cls, *interfaces, **kwargs)File "D:\Program Files\Python39\lib\site-packages\jpype\_jproxy.py", line 80, in _createJProxyactualIntf = _prepareInterfaces(cls, intf)File "D:\Program Files\Python39\lib\site-packages\jpype\_jproxy.py", line 51, in _prepareInterfacesactualIntf = _convertInterfaces(intf)File "D:\Program Files\Python39\lib\site-packages\jpype\_jproxy.py", line 156, in _convertInterfacesactualIntf.add(_jpype.JClass(item))File "D:\Program Files\Python39\lib\site-packages\jpype\_jclass.py", line 99, in __new__return _jpype._getClass(jc)
jpype._core.JVMNotRunning: Java Virtual Machine is not running
从异常Traceback中可以看到,在from java_interface import java_interface
这一步就报错了。
如果想顺利运行,除非在from java_interface import java_interface
之前,就加载jar包启动jvm,但这对于代码风格来说不友好。
第二种:JProxy
首先编写一个python类,这个类包含了testInterface接口声明的方法。
class java_interface_1:def testMethod(self):return 99
然后,调用java程序,通过JProxy实现接口对象的实现。
# 测试python实现java接口作为回调函数res = myJpypeTest.test_recall(to_int(1), JProxy("params.testInterface", inst=java_interface_1()))print(res)
"D:\Program Files\Python39\python.exe" D:/myProjects/python/test_JPype/main.py
100Process finished with exit code 0
遗憾的是,官方文档提到,JProxy是一个老式的API,新代码应该使用@JImplements注释,因为它将支持改进的类型安全和错误处理。
总结
本文介绍了两种方式,都可以在python中实现java接口。虽然两种方式都不完美,但满足实际需求是可以的。
示例源码
https://github.com/linchao001/testJpype
python调用java之Jpype实现java接口相关推荐
- 已解决Python调用免费申请的百度图形识别接口案例
已解决Python调用免费申请的百度图形识别接口{'error_code': 18, 'error_msg': 'Open api qps request limit reached'} 文章目录 报 ...
- python调用百度网盘开放平台接口上传本地文件
本文章是为如何在没有GUI的环境下,使用指令行上传文件到百度网盘提供一个思路,其他操作请自行查询官方文档拓展. 前期工作 申请成为开发者 创建应用 记录AppKey和SecreKey,后续开发需要使用 ...
- Python调用MATLAB的方法(mlab接口库)(未总结)
一.安装 安装mlab库 pip install mlab 显示错误 No module named 'docutils' (不知道这是什么库) pip install docutils (安装 ...
- 2021最新 Python调用腾讯云短信接口
端口相关 登录实例前,需要放通什么端口? 您需要对实例绑定安全组开放相应端口,具体操作步骤请参考 典型场景配置. 云服务器常用端口有哪些? 请参考 服务器常用端口. 为何要开启端口?如何开启某个端口? ...
- python调用微信截图_python-通过微信接口API定时发送信息/截图
#导入模块 import datetime import time import itchat from PIL import ImageGrab from apscheduler.scheduler ...
- hadooppythonjava_通过jpype实现python调用Hadoop Java Client操作HDFS
通过python操作HDFS有非常好用的模块hdfs3 ,其底层依赖c++模块libhdfs3,起初libhdfs3不支持acl权限校验对于设置了acl权限的目录和文件会报NOTFOUND错误(现已解 ...
- java 新浪短链接_短网址链接生成器代码示例——新浪短链接api接口php、java、Python调用演示...
短网址api对接成了大家经常遇到的难题,今天以t.cn短链接api接口为例给出三种语言的调用示例代码: 1.APIKEY获取: 2.调用代码 PHP调用代码 $url = 'http://www.ba ...
- python调用java代码方法
前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...
- python调用java的方法
最近自己开发的一套测试平台,因为上游系统经常修改主数据,导致其中一个功能经常失败,要频繁找上游测试帮忙修改数据. 基于此种原因,对于这种过于依赖上游系统的接口,决定放弃直接调上游系统的http请求下发 ...
最新文章
- opencv 操作本地摄像头实现录像
- SetConsoleCtrlHandler 处理控制台消息
- 关于Unity中场景的导入与导出(专题九)
- gulp html 模块化,使用Gulp如何实现静态网页模块化具体怎么做?
- sqlserver中在建立与服务器的连接时出错
- [html] 页面刷新时sessionStroage会变(会清空)吗?
- Windows Server 2008 R2托管服务账户(MSA)的功能
- 【linux】make出现遗漏分隔符
- 魔乐手机管家V2.0内测版惊艳亮相--Android软件
- EasyRecovery的高级设置如何使用
- Remap 后的 USART1 不能发送数据
- 「写论文」“常用关联词”汇总
- css3 书页卷脚_css3实现的书本立体翻页效果代码实例
- 该怎么回答面试官问“你有什么优缺点?”
- Windows10 1903 应用商店错误 代码: 0x80131500 解决办法
- java采用降低图片分辨率大小来压缩图片大小
- Python挑战游戏( PythonChallenge)闯关之路Level- 5
- Connectify+Wireshark捕获手机APP的数据包
- 《控方证人》证词怎样被推翻的
- js跨域交互(jQuery+php)之jsonp使用心得
热门文章
- 被垃圾分类逼疯?这个深度学习技术帮你做到垃圾自动分类
- 电线电缆使用时的安全要求和存放方法
- 计算机二级交付遇到问题怎么解决,交期延误问题的解决办法 !
- php img本地图片路径,php 替换文章中的图片路径,下载图片到本地服务器的方法
- wps怎么把字缩到最小_WPS文字如何调节字体大小突破字号72的限制实现大小随意调...
- iOS9不受信任的企业开发人员,无法信任
- 初识Git与GitHub和使用案例
- 四川一度智信:拼多多活动报名规则解读
- 【小技巧】IDEA更换个性自定义背景
- 忘记服务器root用户密码