Java调用Javascript、Python算法总结

简介: Java调用Javascript、Python算法总结最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用算法。

Java调用Javascript、Python算法总结
最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用算法。不管是调用Javascript文件还是python脚本,都需要将原来的算法文件进行适当的更改,以便可以在Java中传入参数,并且得到算法运算结果。

一、Java调用Javascript

需要注意的是Javascript是弱类型语言,定义变量只需要一个var就可以搞定,但是在Java中却要注意变量类型,不同的输入参数会有不同的类型。

调用js文件时,需要对其进行调整,设置好需要调用的function和相关参数,使用的js文件代码如下(其中有些核心算法不能展示):

复制代码
1 function get3DCode(Latitude,Longitude,Height,level){
2 var latcode=[];var lngcode=[];
3 latcode=GeoSOTCode1D(Latitude,level);
4 lngcode=GeoSOTCode1D(Longitude,level);
5 var heicode=[];var geosot3Dcode=[];
6 heicode=Altcode(Height,level);
7 geosot3Dcode=GeoSOT3D(latcode,lngcode, heicode,level);//三维网格编码
8 var d3code=[];
9 d3code=getQuantcodeString(geosot3Dcode);
10 return d3code;
11 }
复制代码
在Java中使用对应的接口就可以调用,需要设置js文件路径和输入参数,调用的代码如下;

复制代码
1 package whu.get.three.beidou;
2
3 import java.io.FileReader;
4 import javax.script.Invocable;
5 import javax.script.ScriptEngine;
6 import javax.script.ScriptEngineManager;
7
8 /* Java调用并执行js文件,传递参数,并获得返回值 */
9 public class ThreeD_GetBeidouCode {
10 //获取经纬度及高度,返回三维码
11 public static String main(String Latitude,String Longitude,String Height,int CodeSize) throws Exception {
12 //获取经纬度及高度,保存为double类型
13 Double latitude = Double.parseDouble(Latitude);
14 Double longitude = Double.parseDouble(Longitude);
15 Double height = Double.parseDouble(Height);
16 int level = CodeSize;
17
18 //调用js文件
19 ScriptEngineManager manager = new ScriptEngineManager();
20 ScriptEngine engine = manager.getEngineByName("javascript");
21 String jsFileName = System.getProperty("catalina.home") + "/webapps/3DBeiDouCode/WEB-INF/classes/3Dcode.js"; // 读取js文件
22 FileReader reader = new FileReader(jsFileName); // 执行指定脚本
23 engine.eval(reader);
24 String c = "";
25 if(engine instanceof Invocable) {
26 Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数
27 c = String.valueOf(invoke.invokeFunction("get3DCode", latitude, longitude, height, level));
28 }
29 reader.close();
30 return c; //返回三维码
31 }
32 }
复制代码
这里的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代码如下:

复制代码
1 # -- coding:utf-8 --
2 import BaseFunction
3 import numpy as np
4 import itertools
5 import math
6 import sys
7
8 #计算中心要素
9 def cal_central_feature(path,x,y):
10 sf = BaseFunction.open_shpfile(path)
11 x_records = BaseFunction.get_attr_records(sf,x)
12 y_records = BaseFunction.get_attr_records(sf,y)
13
14 dis = []
15 for x0,y0 in zip(x_records,y_records):
16 distance = 0
17
18 for x1,y1 in zip(x_records,y_records):
19 distance = distance + get_distance(x0,y0,x1,y1)
20
21 dis.append(distance)
22
23 i = dis.index(np.min(dis))
24
25 result = [x_records[i],y_records[i]]
26
27 return result
28
29 #计算两点之间的距离
30 def get_distance(x0,y0,x1,y1):
31 xd = x1 - x0
32 yd = y1 - y0
33 distance = math.sqrt(xd2+yd2)
34 return distance
35
36 if name == '__main__':
37 result = cal_central_feature(sys.argv[1],sys.argv[2],sys.argv[3])
38 print(result[0])
39 print(result[1])
复制代码
Java中调用的代码如下:

复制代码
1 package whu.get.three.beidou;
2
3 import java.io.BufferedReader;
4 import java.io.InputStreamReader;
5
6 /* Java调用并执行js文件,传递参数,并活动返回值 */
7 public class CalCentralFeatureClass {
8 //输入shp路径,获取坐标
9 public static String main(String filepath) {
10 String pyPath = System.getProperty("catalina.home") + "/webapps/CalCentralFeature/WEB-INF/classes/CalCentralFeature.py"; //python文件路径
11 String[] args = new String[] { "python", pyPath, filepath, "x","y"};
12 String c = ""; //记录返回值
13 try {
14 Process proc = Runtime.getRuntime().exec(args); //执行py文件
15 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
16 String line = null;
17 while ((line = in.readLine()) != null) {
18 c = c+line+' ';
19 }
20 in.close();
21 proc.waitFor();
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 return c; //返回结果
26 }
27 }
复制代码
得到的运算结果中,每一个python中print的结果,对应一个in.readLine(),可以按照需要获取自己想要的结果。

如果需要将调用python的程序用tomcat发布为服务,也需要配置tomcat的运行环境,同样是添加一个Path,赋值为python安装路径。
原文地址https://www.cnblogs.com/MatthewHome/p/10783002.html

相关文章
|
3天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
【5月更文挑战第3天】本文介绍了如何在Web自动化测试中使用JavaScript执行器(JavascriptExecutor)来完成Selenium API无法处理的任务。首先,需要将WebDriver转换为JavascriptExecutor对象,然后通过executeScript方法执行JavaScript代码。示例用法包括设置JS代码字符串并调用executeScript。文章提供了两个实战场景:一是当时间插件限制输入时,用JS去除元素的readonly属性;二是处理需滚动才能显示的元素,利用JS滚动页面。还给出了一个滚动到底部的代码示例,并提供了详细步骤和解释。
28 10
|
11天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
26 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
1天前
|
JavaScript 前端开发 Java
Java和Javascript互调的例子
Java和Javascript互调的例子
10 3
|
2天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)
【5月更文挑战第4天】本文介绍了如何使用JavaScriptExecutor在自动化测试中实现元素高亮显示。通过创建并执行JS代码,可以改变元素的样式,例如设置背景色和边框,以突出显示被操作的元素。文中提供了一个Java示例,展示了如何在Selenium中使用此方法,并附有代码截图和运行效果展示。该技术有助于跟踪和理解测试过程中的元素交互。
8 0
|
4天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
4天前
|
算法 机器人 Python
Python实现教程:平面最短路径算法
Python实现教程:平面最短路径算法
12 1
|
5天前
|
算法 JavaScript 前端开发
三个js算法
三个js算法
8 2
|
5天前
|
算法 JavaScript
js的两个常用算法
js的两个常用算法
5 1
|
11天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
11天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。