为了账号安全,请及时绑定邮箱和手机立即绑定

Python的JAVA胶水——jpype

标签:
Java Python

Python的JAVA胶水——jpype

python可以作为一门胶水语言使用,可以用其它语言的优势来弥补自身如性能方面的不足,jpype就是在Python中使用jvm的第三方库

文档在这里

安装

sudo pip jpype1 #注意后面有一个1,参考官网

配置安装JAVA环境本文就不再赘述

helloworld

  • 设置参数启动JAVA虚拟机

  • 运行JAVA代码

  • 关闭虚拟机

#coding=utf=8import jpype

jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径jpype.startJVM(jvm=jvmPath) # 启动虚拟机# 执行JAVA代码jpype.java.lang.System.out.println("hello world")
jpype.shutdownJVM() # 关闭jvm-------------------------------------------hello world
JVM activity report     :
    classes loaded       : 31JVM has been shutdown

使用Java中的对象

jpype还支持直接使用编译后的class文件,省去了编译这一环节。

一下是原来的JAVA测试代码

package com;public class JavaClass{
    String value;    public JavaClass(String value)
    { 
        this.value = value+" Java"; 
    } 
    public String getValue()
    { 
        return this.value;
    }    public void say()
    {
        System.out.println("hello java");
    }    public static void main(String[] args) {
        System.out.println("hello world");    
    }
 }

编译后产生JAVA字节码

java -cp com  com.JavaClass

现在的文件结构如下

./
├── com
│   └── JavaClass.class
└── testJava.py

Python代码如下:

#coding=utf=8import jpype

jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径# 启动虚拟机if not jpype.isJVMStarted():
    jpype.startJVM(jvm=jvmPath)# 使用JAVA字节码中定义的类javaClass = jpype.JClass('com.JavaClass')# 实例化对象javaInstance = javaClass('test')#调用JAVA对象的方法print javaInstance.getValue()
javaInstance.say()# 关闭jvmjpype.shutdownJVM()-------------------------------------------test Java
hello java
JVM activity report     :
    classes loaded       : 20JVM has been shutdown

添加jar包

原TestApi.java代码

package test;  
  public class TestApi  {  
    public String getData(String key){  
        return key;  
    }  
    public void printData(String key){  
        System.out.println(key);  
    }  
      
    public static void main(String[] args)  
    {  
        System.out.println(123);  
    }  
}

打包成jar后可以使用Python来调用

#coding=utf-8import jpype

jvmPath = jpype.getDefaultJVMPath()# 用来添加JAVA虚拟机命令行参数ext_classpath = './TestApi.jar'jvmArg = '-Djava.class.path=' + ext_classpathif not jpype.isJVMStarted():
    jpype.startJVM(jvmPath, jvmArg)
    TA = jpype.JPackage('test').TestApi #这种用法可以简化后面的书写
    jd = TA()
    jd.printData('1234')
    s = jd.getData('a')    print s
    system = jpype.java.lang.System #这里也是获得了System
    system.out.println("call system method")
jpype.shutdownJVM()

此例中,同时还使用了JAVA虚拟机启动时的命令行参数,可以订制启动方式

小结

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

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消