検索
ホームページJava&#&チュートリアルJava で Groove コードを動的に呼び出す方法を説明します。

Grails は、迅速な Web アプリケーション開発のためのオープンソース フレームワークであり、Groovy プログラミング言語をベースにしており、Spring、Hibernate、その他の標準 Java フレームワーク上に構築されているため、非常に高い生産性を実現できるツール セットが提供されます。スタンディングフレーム。

1 目的

タスクまたは拡張関数を動的に実行するには、Java で Groovy コードを動的に実行する必要があります

2 プロジェクトの依存関係

<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 動的実行は 3 つありますGroovy コードの一方向

GroovyShell: GroovyShell を使用すると、Java クラス (Groovy クラスも含む) 内の任意の Groovy 式を評価できます。 Binding オブジェクトを使用して式にパラメータを入力し、最終的に GroovyShell を通じて Groovy 式の結果を返すことができます。

GroovyClassLoader: Groovy の GroovyClassLoader を使用して、スクリプトを動的にロードし、その動作を実行します。 GroovyClassLoader は、Java クラスのロードに使用される Groovy クラスの解釈を担当する、カスタマイズされたクラス ローダーです。

GroovyScriptEngine: GroovyShell は主に、対立するスクリプトまたは式を推測するために使用されます。複数の相互関連するスクリプトに切り替える場合は、GroovyScriptEngine を使用することをお勧めします。 GroovyScriptEngine は、指定した場所 (ファイル システム、URL、データベースなど) から Groovy スクリプトをロードし、スクリプトの変更に応じて再ロードします。 GroovyShell と同様に、GroovyScriptEngine でもパラメーター値を渡したり、スクリプト値を返すことができます。

4 プロジェクト構造

Java で Groove コードを動的に呼び出す方法を説明します。

5 GroovyClassLoader メソッド

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

}

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

関連する推奨事項:

Groovy フレームワーク Grails 1.2 リリース

AngularJS HTML Groovy に基づいてログイン機能を実装_AngularJS

以上がJava で Groove コードを動的に呼び出す方法を説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境