近来项目中常常须要将Javascript或许Python中的算法宣布为效劳,而宣布Tomcat效劳则须要在Java中挪用这些算法,因而就难免要举行跨言语挪用算法。不管是挪用Javascript文件照样python剧本,都须要将本来的算法文件举行恰当的变动,以便能够在Java中传入参数,而且取得算法运算效果。
一、Java挪用Javascript
须要注重的是Javascript是弱范例言语,定义变量只须要一个var就能够搞定,然则在Java中却要注重变量范例,差别的输入参数会有差别的范例。
挪用js文件时,须要对其举行调解,设置好须要挪用的function和相干参数,运用的js文件代码以下(个中有些中心算法不能展现):
function get3DCode(Latitude,Longitude,Height,level){ var latcode=[];var lngcode=[]; latcode=GeoSOTCode1D(Latitude,level); lngcode=GeoSOTCode1D(Longitude,level); var heicode=[];var geosot3Dcode=[]; heicode=Altcode(Height,level); geosot3Dcode=GeoSOT3D(latcode,lngcode, heicode,level);//三维网格编码 var d3code=[]; d3code=getQuantcodeString(geosot3Dcode); return d3code; }
在Java中运用对应的接口就能够挪用,须要设置js文件途径和输入参数,挪用的代码以下;
package whu.get.three.beidou; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * Java挪用并实行js文件,通报参数,并取得返回值 */ public class ThreeD_GetBeidouCode { //猎取经纬度及高度,返回三维码 public static String main(String Latitude,String Longitude,String Height,int CodeSize) throws Exception { //猎取经纬度及高度,保存为double范例 Double latitude = Double.parseDouble(Latitude); Double longitude = Double.parseDouble(Longitude); Double height = Double.parseDouble(Height); int level = CodeSize; //挪用js文件 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = System.getProperty("catalina.home") + "/webapps/3DBeiDouCode/WEB-INF/classes/3Dcode.js"; // 读取js文件 FileReader reader = new FileReader(jsFileName); // 实行指定剧本 engine.eval(reader); String c = ""; if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; // 挪用merge要领,并传入两个参数 c = String.valueOf(invoke.invokeFunction("get3DCode", latitude, longitude, height, level)); } reader.close(); return c; //返回三维码 } }
这里的ThreeD_GetBeidouCode类只是一个一般的类,须要在其他可运转的主函数中挪用这个类的main要领,传入运转参数就能够取得效果。
二、Java挪用Python
Java挪用python剧本有好几种要领,最简朴的是经由过程Jython来直接运转python代码,然则这类要领不支持python中援用的第三方库,因而我运用了Runtime来挪用的要领,这也相称因而在控制台实行剧本。
须要注重的是,Java挪用python时,不能经由过程return语句来猎取返回值,而只能经由过程print将效果写入到规范输出流中,然后在Java中经由过程规范输入流来读取到返回效果。
假如对python环境有请求,比如在特定的环境中装置了须要援用的第三方库,则还要在Java工程中增加运转环境,在eclipse中点击Run->Run Configurations->environment,增加Path,值设置为python装置的途径。
在python顺序中做恰当修正:增加援用 import sys,将挪用的函数参数设定为sys.argv[1],sys.argv[2]...注重必需是从1最先计数,将须要返回的效果用print函数打印。
本例中python代码以下:
# -*- coding:utf-8 -*- import BaseFunction import numpy as np import itertools import math import sys #盘算中心要素 def cal_central_feature(path,x,y): sf = BaseFunction.open_shpfile(path) x_records = BaseFunction.get_attr_records(sf,x) y_records = BaseFunction.get_attr_records(sf,y) dis = [] for x0,y0 in zip(x_records,y_records): distance = 0 for x1,y1 in zip(x_records,y_records): distance = distance + get_distance(x0,y0,x1,y1) dis.append(distance) i = dis.index(np.min(dis)) result = [x_records[i],y_records[i]] return result #盘算两点之间的间隔 def get_distance(x0,y0,x1,y1): xd = x1 - x0 yd = y1 - y0 distance = math.sqrt(xd**2+yd**2) return distance if __name__ == '__main__': result = cal_central_feature(sys.argv[1],sys.argv[2],sys.argv[3]) print(result[0]) print(result[1])
Java中挪用的代码以下:
package whu.get.three.beidou; import java.io.BufferedReader; import java.io.InputStreamReader; /** * Java挪用并实行js文件,通报参数,并运动返回值 */ public class CalCentralFeatureClass { //输入shp途径,猎取坐标 public static String main(String filepath) { String pyPath = System.getProperty("catalina.home") + "/webapps/CalCentralFeature/WEB-INF/classes/CalCentralFeature.py"; //python文件途径 String[] args = new String[] { "python", pyPath, filepath, "x","y"}; String c = ""; //纪录返回值 try { Process proc = Runtime.getRuntime().exec(args); //实行py文件 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { c = c+line+' '; } in.close(); proc.waitFor(); } catch (Exception e) { e.printStackTrace(); } return c; //返回效果 } }
取得的运算效果中,每个python中print的效果,对应一个in.readLine(),能够根据须要猎取本身想要的效果。
假如须要将挪用python的顺序用tomcat宣布为效劳,也须要设置tomcat的运转环境,同样是增加一个Path,赋值为python装置途径。
相干教程:Java视频教程
以上就是Java如何挪用Javascript、Python算法的细致内容,更多请关注ki4网别的相干文章!