Heim >Java >javaLernprogramm >Erfahren Sie, wie Sie Groove-Code in Java dynamisch aufrufen

Erfahren Sie, wie Sie Groove-Code in Java dynamisch aufrufen

坏嘻嘻
坏嘻嘻Original
2018-09-14 11:50:033109Durchsuche

Grails ist ein Open-Source-Framework für die schnelle Entwicklung von Webanwendungen. Es basiert auf der Programmiersprache Groovy und baut auf Spring, Hibernate und anderen Standard-Java-Frameworks auf. Dadurch erhalten Sie eine Reihe von Tools, mit denen Sie eine extrem hohe Produktivität erzielen können. Standgestell.

1 Zweck

Dynamische Ausführung von Aufgaben oder erweiterten Funktionen erfordert Java, um groovigen Code dynamisch auszuführen

2 Projektabhängigkeiten

<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 Es gibt 3 dynamische Ausführungen von Groovy-Code-Möglichkeiten

GroovyShell: Mit GroovyShell können Sie beliebige Groovy-Ausdrücke in Java-Klassen (sogar Groovy-Klassen) auswerten. Sie können das Binding-Objekt verwenden, um Parameter in den Ausdruck einzugeben und schließlich das Ergebnis des Groovy-Ausdrucks über GroovyShell zurückzugeben.

GroovyClassLoader: Verwenden Sie den GroovyClassLoader von Groovy, um ein Skript dynamisch zu laden und sein Verhalten auszuführen. GroovyClassLoader ist ein angepasster Klassenlader, der für die Interpretation von Groovy-Klassen verantwortlich ist, die beim Laden von Java-Klassen verwendet werden.

GroovyScriptEngine: GroovyShell wird hauptsächlich verwendet, um gegensätzliche Skripte oder Ausdrücke abzuleiten. Wenn Sie zu mehreren miteinander verbundenen Skripten wechseln, ist es besser, GroovyScriptEngine zu verwenden. Die GroovyScriptEngine lädt Groovy-Skripte von dem von Ihnen angegebenen Speicherort (Dateisystem, URL, Datenbank usw.) und lädt sie neu, wenn sich die Skripte ändern. Wie GroovyShell ermöglicht auch GroovyScriptEngine die Übergabe von Parameterwerten und kann Skriptwerte zurückgeben.

4 Projektstruktur

Erfahren Sie, wie Sie Groove-Code in Java dynamisch aufrufen

5 GroovyClassLoader-Methode

Groovy-Klassen testen

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>>() {});
    }

}

Java-Code testen

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

Verwandte Empfehlungen:

Groovy Framework Grails 1.2 veröffentlicht

Anmeldefunktion basierend auf AngularJS+HTML+Groovy_AngularJS

Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Sie Groove-Code in Java dynamisch aufrufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn