-
Groovy是什么?
Groovy 是 用于Java虚拟机的一种敏捷的动态语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使Groovy 与 Java 代码的互操作很容易。
Groovy 教程_w3cschoolGroovy语言:Groovy 教程_w3cschool
groovy与java中结合使用,场景举例:在数据库中存储groovy语句,在java代码中拿出来执行。通过这个可以设计一个公共的工具。
srpingboot中引入groovy
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.5</version>
</dependency>
-
在java中调用groovy的方式
方式一:使用GroovyShell执行groovy脚本
1.1使用 GroovyShell 执行groovy字符串
public static void main(String[] args) {
String ss = "def x = 5;\n" +
"println('Hello World' + x);";
GroovyShell shell = new GroovyShell();
shell.evaluate(ss);
}
1.2:通过evaluate方法调用groovy脚本文件
首先新建一个Groovy文件:GroovyShell_1_1.groovy,里面有一个无参的方法sayHello,并在最后调用该方法。
// 不带参数的groovy方法
def sayHello() {
println 'Hello World.'
// 如果不写return, groovy方法的默认最后一行为 方法的返回值
//return "GroovyShell_1中的sayHello()方法的返回值"
"GroovyShell_1中的sayHello()方法的返回值"
}
// 运行groovy方法
sayHello()
在Java中就可以直接调用这个groovy文件执行了,方法如下:
// 调用GroovyShell_1_1
public static void testGroovy2() throws CompilationFailedException, IOException {
GroovyShell groovyShell = new GroovyShell();
Object result = groovyShell.evaluate(new File("src/main/java/com/juxinli/groovy/GroovyShell_1_1.groovy"));
logger.info(result.toString());
}
这种方式也可以传参:
// 带参数的groovy方法
def sayHello(name) {
println "Hello " + name + "."
// 如果不写return, groovy方法的默认最后一行为 方法的返回值
//return "GroovyShell_1中的sayHello()方法的返回值"
"GroovyShell_1中的sayHello(name)方法的返回值"
}
// 运行groovy方法
sayHello(name)
// 调用GroovyShell_1_2
public static void testGroovy3() throws CompilationFailedException, IOException {
// 调用带参数的groovy shell时,使用bind绑定数据
Binding binding = new Binding();
binding.setProperty("name", "Juxinli");
GroovyShell groovyShell = new GroovyShell(binding);
Object result = groovyShell.evaluate(new File("src/main/java/com/juxinli/groovy/GroovyShell_1_2.groovy"));
logger.info(result.toString());
}
方式二:通过GroovyClassLoader动态加载Groovy Class
GroovyClassLoader,用来加载Groovy类的加载器
首先新建了Groovy Class
package com.juxinli.groovy
class GroovyShell_2 {
public String sayHello(String name, String sex, int age) {
println 'GroovyShell_2 的sayHello(String name, String sex, int age)方法';
return "name: " + name + ", sex: " + sex + ", age: " + age;
}
}
在Tool_GroovyShell_2中就可以加载该Groovy Class了.。该方式和java的反射相似。
public class Tool_GroovyShell_2 {
private static Logger logger = Logger.getLogger(Tool_GroovyShell_2.class);
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);
}
/**
* 通过GroovyClassLoader加载GroovyShell_2,并反射调用其sayHello(String name, String sex, int age)方法
*
*/
public static String invokeSayHello(String name, String sex, int age) {
String result = "";
File groovyFile = new File("src/main/java/com/juxinli/groovy/GroovyShell_2.groovy");
if (!groovyFile.exists()) {
return result;
}
try {
// 获得GroovyShell_2加载后的class
Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
// 获得GroovyShell_2的实例
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
// 反射调用sayHello方法得到返回值
Object methodResult = groovyObject.invokeMethod("sayHello", new Object[] {name, sex, age});
if (methodResult != null) {
result = methodResult.toString();
}
} catch (Exception e) {
logger.warn("加载groovy类失败", e);
}
return result;
}
public static void main(String[] args) throws Exception {
initGroovyClassLoader();
System.out.println(invokeSayHello("张三", "男", 25));
}
}
方式三:使用GroovyScriptEngine脚本引擎加载Groovy脚本
GroovyScriptEngine从指定的位置(文件系统,URL,数据库等等)加载Groovy脚本,并且随着脚本变化可重新加载它们。
首先在com.juxinli.groovy.shell包中新建2个groovy script
GroovyShell_3_1.groovy
package com.juxinli.groovy.shell
def sayHello(String name) {
println "Hello, " + name
"GroovyShell_3_1中的sayHello()方法的返回值"
}
sayHello(name)
GroovyShell_3_2.groovy文章来源:https://www.toymoban.com/news/detail-477606.html
package com.juxinli.groovy.shell
def sayHello(String name) {
println "你好, " + name
"GroovyShell_3_2中的sayHello()方法的返回值"
}
sayHello(name)
使用GroovyScriptEngine从com.juxinli.groovy.shell包中加载、运行这些script文章来源地址https://www.toymoban.com/news/detail-477606.html
public class Tool_GroovyShell_3 {
public static void main(String[] args) throws Exception {
// GroovyScriptEngine的根路径,如果参数是字符串数组,说明有多个根路径
GroovyScriptEngine engine = new GroovyScriptEngine("src/main/java/com/juxinli/groovy/shell/");
//GroovyScriptEngine engine = new GroovyScriptEngine(new String[] {"src/main/java/com/juxinli/groovy/shell/"});
Binding binding = new Binding();
binding.setVariable("name", "juxinli");
Object result1 = engine.run("GroovyShell_3_1.groovy", binding);
System.out.println(result1);
Object result2 = engine.run("GroovyShell_3_2.groovy", binding);
System.out.println(result2);
}
}
到了这里,关于在java中调用Groovy的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!