Maison  >  Article  >  Java  >  Comment Java appelle-t-il les algorithmes Javascript et Python ?

Comment Java appelle-t-il les algorithmes Javascript et Python ?

little bottle
little bottleavant
2019-04-28 14:15:102990parcourir

Cet article parle principalement de l'utilisation de Java pour appeler des algorithmes Javascript et Python. Il a une certaine valeur de référence. Les amis intéressés peuvent en apprendre davantage.

Dans les projets récents, il est souvent nécessaire de publier des algorithmes en Javascript ou Python en tant que services, et la publication de services Tomcat nécessite d'appeler ces algorithmes en Java, il est donc inévitable d'appeler des algorithmes dans plusieurs langages. Que vous appeliez un fichier Javascript ou un script Python, vous devez apporter les modifications appropriées au fichier d'algorithme d'origine afin de pouvoir transmettre des paramètres en Java et obtenir les résultats de l'opération de l'algorithme.

1. Java appelle Javascript

Il est à noter que Javascript est un langage faiblement typé Vous n'avez besoin que d'une var pour définir une variable. Cependant, en Java, vous devez faire attention à la variable. Les types et les différentes entrées seront de différents types.

Lors de l'appel du fichier js, vous devez l'ajuster et définir les fonctions et les paramètres associés qui doivent être appelés. Le code du fichier js utilisé est le suivant (certains des algorithmes de base ne peuvent pas être affichés) :

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;
}

In Il peut être appelé à l'aide de l'interface correspondante en Java. Vous devez définir le chemin du fichier js et les paramètres d'entrée :

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; //返回三维码
    }
}

La classe ThreeD_GetBeidouCode ici est simplement. une classe ordinaire et doit être dans d'autres fonctions principales exécutables. Appelez la méthode principale de cette classe et transmettez les paramètres en cours d'exécution pour obtenir le résultat.

2. Java appelle Python

Il existe plusieurs façons pour Java d'appeler des scripts python. La plus simple consiste à exécuter directement le code python via Jython, mais cette méthode ne prend pas en charge le troisième code référencé. en python. Bibliothèque tierce, j'ai donc utilisé Runtime pour appeler la méthode, ce qui équivaut à exécuter le script sur la console.

Il convient de noter que lorsque Java appelle python, la valeur de retour ne peut pas être obtenue via l'instruction return, mais le résultat ne peut être écrit dans le flux de sortie standard via print, puis lu via le flux d'entrée standard. en Java Obtenez le résultat renvoyé.

S'il existe des exigences pour l'environnement Python, telles que l'installation d'une bibliothèque tierce qui doit être référencée dans un environnement spécifique, vous devez également ajouter un environnement d'exécution au projet Java et cliquer sur Exécuter->Exécuter Configurations - dans l'environnement Eclipse >, ajoutez Path et définissez la valeur sur le chemin de l'installation de Python.

Apportez les modifications appropriées dans le programme python : ajoutez une référence à import sys, et définissez les paramètres de la fonction appelée sur sys.argv[1], sys.argv[2]... Notez que le comptage doit commencer à partir de 1, utilisez la fonction d'impression pour imprimer les résultats qui doivent être renvoyés.

Dans cet exemple, le code python est le suivant :

# -*- 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])

Le code appelé en Java est le suivant :

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; //返回结果
    }
}

Parmi les résultats d'opération obtenus, chaque résultat imprimé dans python correspond à un in.readLine(), vous pouvez obtenir les résultats souhaités selon vos besoins.

Si vous devez publier un programme qui appelle python en tant que service à l'aide de Tomcat, vous devez également configurer l'environnement d'exploitation Tomcat. Vous devez également ajouter un chemin et l'attribuer au chemin d'installation de Python.

Tutoriels associés : Tutoriel vidéo Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer