python如何调用java方法

话说, python真的是无所不能。
我们在抓app数据的时候,有很大概率会遇见参数加密的情况。我们费了很大力气,找到了加密的位置,扣出了加密的函数,但是由于是反编译后的java代码,对于用python写爬虫的程序员来说,如果再把java翻译成python,有时候就很困难了,特别是遇到了一些移位操作时候,由于python默认会把int转成long,java则是溢出,python和java相同逻辑,得到的结果却是不一样。那就更困难了。
好消息是,python可以直接调用jar包。我们可以直接把加密代码直接打成jar包,供python爬虫来调用,这样一来,省去了很多的麻烦事。
python 调用jar包可以使用jpype模块来实现

安装jpype

需要先安装好python3.7、java8、visual C++编译器,
pip install jpype1
安装出现错误信息请自行百度查找解决方法。

简单使用
启动 jvm 和关闭 jvm

JPype 提供的 startJVM(jvm, *args) 函数的作用是启动java虚拟机,在代码中调用java代码之前,首先要使用此方法来启动java虚拟机。
jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\Program Files\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。
args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:
-agentlib:libname[=options] -classpath classpath -verbose -Xint

shutdownJVM() 函数的作用是关闭java虚拟机,在结束调用java代码时候,使用此方法可以关闭java虚拟机。

判断java虚拟机是否启动

JPype 提供的 jpype.isJVMStarted() 函数可以判断 JVM 是否已启动。
返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动

hello world 程序
import jpype 
jvmPath = jpype.getDefaultJVMPath() 
jpype.startJVM(jvmPath) 
jpype.java.lang.System.out.println( “ hello world! ” ) 
jpype.shutdownJVM()
使用jpype调用jar包

jar包源代码

package wwz.bigeye;

public class JpypeDemo {
    public String sayHello(String user){
        return "hello" + user;
    }
    public int calc(int a, int b){
        return a + b;
    }
}

将此源码打包编译为:JpypeDemo.jar。

python调用代码

# Djava.class.path指定jar包的路径
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % (os.getcwd() + '\JpypeDemo.jar'))

# 找到class
JYDClass = JClass("wwz.bigeye.JpypeDemo")
# 执行类中的函数
result = (JYDClass.calc(1, 2))
print(result)
shutdownJVM()

执行以上代码,就可以看到执行的结果啦。是不是很简单!


大家可关注一下我的个人公众号,不定时分享一些爬虫案例和技巧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值