对于python操作java代码的场景来说,比较多的可能就是涉及加密的场景,尤其涉及到登录的场景,对于输入的账号密码可能会涉及到加密,如果开发告诉我们如何加密,那么,OK,我们可以直接通过代码去实现,如果不知道,对于我们的自动化来说,我们可以通过操作开发的java文件,也就是说,让开发同学提供jar包或者java文件
比如说如下的java文件
import java.math.BigInteger;
import java.security.MessageDigest;
public class MD5Util {
public static String getMD5String(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
System.out.println(getMD5String(args[0]));
}
}
其中
类比python文件,我们可以知道MD5Util 是一个类,getMD5String是一个方法,其中这个方法还传递了字符串参数,知道了这些,我们就可以用我们的python代码去实现了
我们使用我们的jpype1库,直接pip install即可
import jpype
jvm_path = jpype.getDefaultJVMPath()
jpype.startJVM(jvm_path,'-ea','-Djava.class.path={}'.format('./MD5util.jar'),convertStrings=False)
jclass = jpype.JClass('MD5Util') # 加载类
calc = jclass() # 传入所需参数
value = calc.getMD5String("123456") # 调用类中的getMD5String方法
print(value)
jpype.shutdownJVM() # 关闭JAVA虚拟机
从原理上来讲,我们要安装好jdk并配置好环境变量,也就是说,我们需要有一个java的虚拟环境
jvm_path 获取jvm路径
jpype.startJVM(jvm_path,‘-ea’,‘-Djava.class.path={}’.format(‘./MD5util.jar’),convertStrings=False) 启用虚拟机,同时传递一些参数,并且也需要对应的jar包路径
jclass = jpype.JClass(‘MD5Util’) 这里就是加载类方法,括号里面的就是我们可以替换成对应java文件里面的类的方法
calc = jclass() # 传入所需参数
value = calc.getMD5String(“123456”) 之后,实例化我们的对应方法,传对应的参数,这里的getMD5String就是java文件里面对应的方法,找到自己的,替换即可
最后打印出来
关闭虚拟机即可
这里我们实际运行一下:
我们发现成功了
以上
这里我们采用的是md5加密,有可能人家会自定义一些加密方法,我们都可以类比这种方式进行获取加密方式的结果