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接口相关推荐

  1. 已解决Python调用免费申请的百度图形识别接口案例

    已解决Python调用免费申请的百度图形识别接口{'error_code': 18, 'error_msg': 'Open api qps request limit reached'} 文章目录 报 ...

  2. python调用百度网盘开放平台接口上传本地文件

    本文章是为如何在没有GUI的环境下,使用指令行上传文件到百度网盘提供一个思路,其他操作请自行查询官方文档拓展. 前期工作 申请成为开发者 创建应用 记录AppKey和SecreKey,后续开发需要使用 ...

  3. Python调用MATLAB的方法(mlab接口库)(未总结)

    一.安装 安装mlab库 pip install mlab 显示错误 No module named 'docutils'  (不知道这是什么库) pip install docutils   (安装 ...

  4. 2021最新 Python调用腾讯云短信接口

    端口相关 登录实例前,需要放通什么端口? 您需要对实例绑定安全组开放相应端口,具体操作步骤请参考 典型场景配置. 云服务器常用端口有哪些? 请参考 服务器常用端口. 为何要开启端口?如何开启某个端口? ...

  5. python调用微信截图_python-通过微信接口API定时发送信息/截图

    #导入模块 import datetime import time import itchat from PIL import ImageGrab from apscheduler.scheduler ...

  6. hadooppythonjava_通过jpype实现python调用Hadoop Java Client操作HDFS

    通过python操作HDFS有非常好用的模块hdfs3 ,其底层依赖c++模块libhdfs3,起初libhdfs3不支持acl权限校验对于设置了acl权限的目录和文件会报NOTFOUND错误(现已解 ...

  7. java 新浪短链接_短网址链接生成器代码示例——新浪短链接api接口php、java、Python调用演示...

    短网址api对接成了大家经常遇到的难题,今天以t.cn短链接api接口为例给出三种语言的调用示例代码: 1.APIKEY获取: 2.调用代码 PHP调用代码 $url = 'http://www.ba ...

  8. python调用java代码方法

    前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...

  9. python调用java的方法

    最近自己开发的一套测试平台,因为上游系统经常修改主数据,导致其中一个功能经常失败,要频繁找上游测试帮忙修改数据. 基于此种原因,对于这种过于依赖上游系统的接口,决定放弃直接调上游系统的http请求下发 ...

最新文章

  1. opencv 操作本地摄像头实现录像
  2. SetConsoleCtrlHandler 处理控制台消息
  3. 关于Unity中场景的导入与导出(专题九)
  4. gulp html 模块化,使用Gulp如何实现静态网页模块化具体怎么做?
  5. sqlserver中在建立与服务器的连接时出错
  6. [html] 页面刷新时sessionStroage会变(会清空)吗?
  7. Windows Server 2008 R2托管服务账户(MSA)的功能
  8. 【linux】make出现遗漏分隔符
  9. 魔乐手机管家V2.0内测版惊艳亮相--Android软件
  10. EasyRecovery的高级设置如何使用
  11. Remap 后的 USART1 不能发送数据
  12. 「写论文」“常用关联词”汇总
  13. css3 书页卷脚_css3实现的书本立体翻页效果代码实例
  14. 该怎么回答面试官问“你有什么优缺点?”
  15. Windows10 1903 应用商店错误 代码: 0x80131500 解决办法
  16. java采用降低图片分辨率大小来压缩图片大小
  17. Python挑战游戏( PythonChallenge)闯关之路Level- 5
  18. Connectify+Wireshark捕获手机APP的数据包
  19. 《控方证人》证词怎样被推翻的
  20. js跨域交互(jQuery+php)之jsonp使用心得

热门文章

  1. 被垃圾分类逼疯?这个深度学习技术帮你做到垃圾自动分类
  2. 电线电缆使用时的安全要求和存放方法
  3. 计算机二级交付遇到问题怎么解决,交期延误问题的解决办法 !
  4. php img本地图片路径,php 替换文章中的图片路径,下载图片到本地服务器的方法
  5. wps怎么把字缩到最小_WPS文字如何调节字体大小突破字号72的限制实现大小随意调...
  6. iOS9不受信任的企业开发人员,无法信任
  7. 初识Git与GitHub和使用案例
  8. 四川一度智信:拼多多活动报名规则解读
  9. 【小技巧】IDEA更换个性自定义背景
  10. 忘记服务器root用户密码