Maison  >  Article  >  Java  >  Apprenez à appeler dynamiquement du code Groove en Java

Apprenez à appeler dynamiquement du code Groove en Java

坏嘻嘻
坏嘻嘻original
2018-09-14 11:50:033051parcourir

Grails est un framework open source pour le développement rapide d'applications Web. Il est basé sur le langage de programmation Groovy et construit sur Spring, Hibernate et d'autres frameworks Java standard, vous offrant ainsi un ensemble d'outils permettant d'atteindre une productivité ultra-élevée. Cadre debout.

1 Objectif

L'exécution dynamique de tâches ou de fonctions étendues nécessite que Java exécute dynamiquement du code groovy

2 Dépendances du projet

<dependencies>
  <dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.5.2</version>
    <type>pom</type>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
  </dependency>
</dependencies>

3 Exécuter dynamiquement groovy code Il existe 3 façons

GroovyShell : GroovyShell permet d'évaluer des expressions Groovy arbitraires dans des classes Java (même des classes Groovy). Vous pouvez utiliser l'objet Binding pour saisir des paramètres dans l'expression et enfin renvoyer le résultat de l'expression Groovy via GroovyShell.

GroovyClassLoader : utilisez GroovyClassLoader de Groovy pour charger dynamiquement un script et exécuter son comportement. GroovyClassLoader est un chargeur de classes personnalisé chargé d'interpréter les classes Groovy utilisées lors du chargement des classes Java.

GroovyScriptEngine : GroovyShell est principalement utilisé pour déduire des scripts ou des expressions opposés. Si vous passez à plusieurs scripts interdépendants, il sera préférable d'utiliser GroovyScriptEngine. GroovyScriptEngine charge les scripts Groovy à partir de l'emplacement que vous spécifiez (système de fichiers, URL, base de données, etc.) et les recharge à mesure que les scripts changent. Comme GroovyShell, GroovyScriptEngine vous permet également de transmettre des valeurs de paramètres et peut renvoyer des valeurs de script.

4 Structure du projet

Apprenez à appeler dynamiquement du code Groove en Java

5 Méthode GroovyClassLoader

Tester les classes groovy

package com.chy

import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.TypeReference

/**
 * groove class
 */
class TestGroovy {

    void print() {
        System.out.println("hello word!!!!");
    }

    List<String> printArgs(String str1, String str2, String str3) {
        String jsonString = "[\""+str1+"\",\""+str2+"\",\""+str3+"\"]";
        return JSON.parseObject(jsonString, new TypeReference<List<String>>() {});
    }

}

Tester le code Java

package com.chy;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import org.codehaus.groovy.control.CompilerConfiguration;

import java.io.File;
import java.util.List;

/**
 * @Title: GroovyClassLoaderApp
 * @Description: 演示 GroovyClassLoader 方式
 * @author chy
 * @date 2018/9/12 22:54
 */
public class GroovyClassLoaderApp {

    private static GroovyClassLoader groovyClassLoader = null;

    public static void initGroovyClassLoader() {
        CompilerConfiguration config = new CompilerConfiguration();
        config.setSourceEncoding("UTF-8");
        // 设置该GroovyClassLoader的父ClassLoader为当前线程的加载器(默认)
        groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
    }


    public static void main(String[] args) {
        loadClass();
        System.out.println("======================");
        loadFile();
    }

    /**
     * 通过类加载groovy
     */
    private static void loadClass(){
        GroovyObject groovyObject = null;
        try {
            groovyObject = (GroovyObject) GroovyClassLoaderApp.class.getClassLoader().loadClass("com.chy.TestGroovy").newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 执行无参函数
        groovyObject.invokeMethod("print",null);

        System.out.println("============================");

        // 执行有参函数
        Object[] objects = new Object[]{"abc", "def", "ghi"};
        List<String> ls=(List<String>) groovyObject.invokeMethod("printArgs", objects);
        ls.stream().forEach(System.out::println);
    }

    /**
     * 通过文件路径加载groovy
     * @return
     */
    private static boolean loadFile(){
        File groovyFile = new File("src/main/java/com/chy/TestGroovy.groovy");
        if (!groovyFile.exists()) {
            System.out.println("文件不存在");
            return false;
        }

        initGroovyClassLoader();

        try {
            List<String> result;
            // 获得TestGroovy加载后的class
            Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
            // 获得TestGroovy的实例
            GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
            // 反射调用printArgs方法得到返回值
            Object methodResult = groovyObject.invokeMethod("printArgs", new Object[] {"chy", "zjj", "xxx"});
            if (methodResult != null) {
                result =(List<String>) methodResult;
                result.stream().forEach(System.out::println);
            }
            return true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return false;
    }
}

Recommandations associées :

Publication du framework Groovy Grails 1.2

Fonction de connexion basée sur AngularJS+HTML+Groovy_AngularJS

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn