python调用java代码
python作为公认的胶水语言,调用java肯定是没有问题的,这么好玩的事情就做一个简单的例子
java源码生成jar
直接复制解密函数,将其保存为c.java
public class c {
private byte[] a = null;
private int b = 0;
private int c = 0;
private byte[] d = null;
static {
if (a.b) {
a.a(c.class);
}
}
public c(String str) {
this.d = str.getBytes();
}
private void a(byte[] bArr, int i, int i2, byte[] bArr2, int i3) {
if (i + i2 > bArr.length) {
throw new RuntimeException("input buffer too short");
} else if (i3 + i2 <= bArr2.length) {
for (int i4 = 0; i4 < i2; i4++) {
this.b = (this.b + 1) & 255;
byte[] bArr3 = this.a;
int i5 = this.b;
this.c = (bArr3[i5] + this.c) & 255;
byte b2 = bArr3[i5];
int i6 = this.c;
bArr3[i5] = bArr3[i6];
bArr3[i6] = b2;
bArr2[i4 + i3] = (byte) (bArr3[(bArr3[i5] + bArr3[i6]) & 255] ^ bArr[i4 + i]);
}
} else {
throw new RuntimeException("output buffer too short");
}
}
private void b(byte[] bArr) {
this.b = 0;
this.c = 0;
if (this.a == null) {
this.a = new byte[256];
}
for (int i = 0; i < 256; i++) {
this.a[i] = (byte) i;
}
int i2 = 0;
int i3 = 0;
for (int i4 = 0; i4 < 256; i4++) {
byte[] bArr2 = this.a;
i3 = ((bArr[i2] & 255) + bArr2[i4] + i3) & 255;
byte b2 = bArr2[i4];
bArr2[i4] = bArr2[i3];
bArr2[i3] = b2;
i2 = (i2 + 1) % bArr.length;
}
}
private void a() {
b(this.d);
}
public byte[] a(byte[] bArr) {
a();
byte[] bArr2 = new byte[bArr.length];
a(bArr, 0, bArr.length, bArr2, 0);
return bArr2;
}
}
打开cmd控制台,然后CD到c.java所在的目录,执行下面代码,将java源码转为calss文件
javac c.java
然后再执行下面代码,将class文件转为jar文件
jar cvf c.jar c.class
python通过jvm虚拟机加载jar
python调用java需要用到jpype这个库,使用pip install JPype1进行安装,然后将前面得到的c.jar复制到py文件的同目录。
在加载java类之前,先要用jpype.startJVM来启动jvm虚拟机,其中有三个参数,第一个参数是jvm的路径,默认直接使用jpype.getDefaultJVMPath(),第二和第三个参数是加载jar的路径
因为楼主没有给出成品,我也不放全部源代码了,下面是调用java的部分代码
import jpype
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=c.jar") # 启动java虚拟机
jclass = jpype.JClass("c") # 获取java类
C = jclass(salt) # 实例化java对象
data = C.b(base64.b64decode(response.encode())) # 调用对象的b方法
print(data) # 打印解密结果
jpype.shutdownJVM() # 卸载所有的java类,jvm虚拟机会跟随python进程结束而结束