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
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!