python技术专栏

python调用java详细教程

2019-11-06  本文已影响0人  假程序员
image.png

该项目打包成ajar.jar
AbsCore.java

package package_a;

public abstract class AbsCore {
    public String methodA() {
        return "methodA";
    }
    
    public String methodB() {
        return "methodB";
    }
}

C.java

package package_a;

public class C extends AbsCore {
}

D.java

package package_a;

public class D extends AbsCore {
    @Override
    public String methodA() {
        return "DA";
    }
    @Override
    public String methodB() {
        return "DB";
    }
}

ICore.java

package package_a;

public interface ICore {
    public String test();
}

AImpl.java

package package_a;

public class AImpl implements ICore {
    private String name = "A";

    public String test() {
        return name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

BImpl.java

package package_a;

public class BImpl implements ICore {

    public String test() {
        return "B";
    }

}
image.png

该项目打包成bjar.jar

Test.java

package package_b;

import package_a.*;

public class Test {
    public static String testStatic() {// 测试静态方法 
        return "testStatic success.";
    }

    public void testVoid() {// 测试Void方法
        System.out.println("testVoid success.");
    }

    public String testString() {// 测试返回String的方法
        return "testString success.";
    }

    public String testString(String str) { //测试重载的方法
        return str;
    }

    public String testICore(ICore core) { //测试传入java实例,以接口类型入参
        return core.test();
    }

    public String testAbsCore(AbsCore core) { //测试传入java实例, 以抽象类型入参
        return core.methodA();
    }

    public ICore testICore() { //测试返回接口类型的java实例
        AImpl a = new AImpl();
        a.setName("hello");
        return a;
    }

    public AbsCore testAbsCore() { //测试返回抽象类型的java实例
        D d = new D();
        return d;
    }
}
image.png

bjar.jar放在本目录,ajar.jar放在其他目录,模拟依赖问题。

usejar.py

# coding=utf-8
import jpype
import os
import platform

if __name__ == '__main__':
    jvm_path = jpype.getDefaultJVMPath()
    dependence_dirs = list()
    dependence_dirs.append(os.path.join(os.path.abspath("."))) # 当前目录,所要使用的jar则放在该目录
    dependence_dirs.append(r"/Users/apple/Desktop")  # 被依赖的jar所在的目录,被依赖的目录可能由多个,自行append即可

    if platform.system() == "Windows": #处理分隔符号
        java_dirs = ";".join(dependence_dirs)
    else:
        java_dirs = ":".join(dependence_dirs)

    jpype.startJVM(jvm_path, "-ea", "-Djava.ext.dirs=%s" % java_dirs, convertStrings=True)

    AbsCore = jpype.JClass("package_a.AbsCore")
    AImpl = jpype.JClass("package_a.AImpl")
    BImpl = jpype.JClass("package_a.BImpl")
    C = jpype.JClass("package_a.C")
    D = jpype.JClass("package_a.D")
    ICore = jpype.JClass("package_a.ICore")

    Test = jpype.JClass("package_b.Test")

    test = Test()
    print Test.testStatic()  # 测试静态方法
    test.testVoid()  # 测试Void方法
    print test.testString()  # 测试返回String的方法
    print test.testString("aaaaaa")  # 测试重载的方法
    print test.testICore(AImpl()) # 测试java实例入参
    print test.testICore(BImpl())
    print test.testAbsCore(C()) #测试java实例入参
    print test.testAbsCore(D())

    print test.testICore().test() #获得java实例
    print test.testAbsCore().methodB() #获得java实例

    jpype.shutdownJVM()

image.png

附上java的源码,以及本人编译后的jar。
链接:https://pan.baidu.com/s/11GQ2bm_DCm-Lz98x5GSB2w 密码:0azg

上一篇 下一篇

猜你喜欢

热点阅读