这几天一师兄交给了我一任务,任务是:使用java 的工具包把java代码转换成AST,能够实现可视化、遍历和节点查询,并且用python中的命令行封装一下。将java代码转换成AST,能够实现可视化、遍历和节点查询这个part我在这儿就不细说了,各位朋友若是感兴趣可以去翻我之前转载的文章,上面很清楚。今天主要是将如何在python中调用Java项目好好细说,因为网上给出的讲解各种各样,而且时效性不高,所以斗胆将自己实现的代码拿出来给各位分享

(1)配套环境

环境为python2.7(32位)+eclipse(32位)+jdk1.8(32位)  大家一定要注意:配套的环境都为32位,jdk版本可以是最新的,虽然网上给出的都是用1.6 但是时代在变化,连官网现在都不提供1.6的版本了,我们肯定是要与时俱进的,1.8我亲测有效

(2)使用jpype调用java

    Jpype官方介绍:

    JPype是一种允许python程序完全访问java类库的工作。这不是像Jython/JPython那样通过重新实现Python实现的,而是通过在两个虚拟机的本机级别上进行接口实现的。最终,在许多情况下(尽管不是所有情况下)用python替换Java应该是可能的。JSP、servlet、RMI服务器和IDE插件是很好的候选者

下面就是具体实现代码了

from jpype import *
import os.path

jarpath = os.path.join(os.path.abspath('.'), "D:/PyCharm-Community/Workplace/sample_py/")
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % (jarpath + 'JarTest2.jar'))
# JDClass = JClass("com.xinge.JdtAstUtil")
# JDClass = JClass("com.xinge.JpypeDemo")
jd = JPackage("com.xinge").DemoVisitorTest()
jprint = java.lang.System.out.println
path = "D:/Eclipse-oxygen-workplace/JavaTestDemo1/src/com/xinge/SimpleTest2.java"
jd.VisitorTest(path)
# jd.printText("xinge")

调用方法中的具体参数大家就根据自己打包的jar包具体位置而定了

os.path.join()方法中第一个参数没什么好说的了,第二个参数就是你将你的java项目打包成jar包所在的根目录位置

JPype 提供的 startJVM() 函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。

  • jpype.startJVM() 的定义
  • jpype.startJVM() 的参数参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\Program Files\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。参数 2: args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:
•   
startJVM(jvm, *args)
-agentlib:libname[=options]  -classpath classpath  -verbose  -Xint
 2.关闭JVM

当使用完 JVM 后,可以通过 jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。

(3)关键之关键:如何将包含第三方jar包的Java项目打包成jar包

    这个part也是我最吐血的地方了,在网上查了各种资料,但发现都他妈是扯淡,有的连步骤都实现不了,跟别提实现,所以自己才想把自己用汗血(哈哈哈哈)得出的方法给大家分享,希望大家少走弯路,废话说多了哈,直接进入正题

    先说我之前的错误做法吧

python ast解析java项目调用链 python调用java类_jar


上附图是我第一次走错的地方,我是把项目export成了JAR file格式,才发现这个Jar里没有包含类文件里Import的各种jar包,导致出现了这样的错误,也就是调用不了这个类,让我抓狂了一天,终于理解程序猿为什么容易猝死了,天天被气炸了,那还谈什么身心健康啊,只想分分钟报复社会,哈哈哈哈哈

python ast解析java项目调用链 python调用java类_Jpype_02


TRUE:下图就是正确做法了,将项目export成Runnable JAR file格式即可,这个jar包里面就会包含原项目中包含的各种jar包了,这个过程中可能会出现jar export finished with warnings类似这样的提醒,别慌这无伤大雅,不会妨碍我们跑我们的项目

python ast解析java项目调用链 python调用java类_JVM_03