ホームページ >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 プロジェクト構造
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 サイトの他の関連記事を参照してください。