一、Groovy简介
Groovy是运行在JVM中的一种动态语言,可以在Java平台上进行编程,使用方式基本与使用Java代码的方式相同,它的语法与Java语言的语法很相似,与Java相比,Groovy更加灵活、简洁,而且完成同样的功能基本上所需要的Groovy代码量会比Java的代码量少,它还增加了很多功能,如:函数式编程、运行时的灵活性以及许多元编程内容。它可以用来构建一个完整的工程,或者作为一个Module,第三方集成到Java代码中。甚至可以作为脚本在执行时动态编译。
官网:https://groovy-lang.org/index.html
二、Groovy的Hello World程序
1. 下载安装groovy环境
到官网下载groovy的sdk,我这里下载的是4.0.20版本,解压到指定的文件夹
配置groovy到系统环境变量中:
GROOVY_HOME:D:\SoftWare\dev\groovy-4.0.20
PATH: %GROOVY_HOME%\bin
设置好环境变量,打开命令行执行命令:groovy -v或者groovy -version命令,看到版本号,则说明环境配置好了
2.创建HelloWord项目
idea创建demo项目,创建时选择语言为Groovy,SDK为刚才安装的目录
新建一个类:HelloGroovy.groovy文件,并编写main方法,执行程序,可以看到控制台的输出结果
三、Groovy基础语法
简单的打印语句
可以直接使用println来打印语句
println "Hello, Groovy!"
def 定义无类型的变量
我们无需显式地声明变量的类型,Groovy 会根据赋给变量的值自动推断其类型
def name = "Even"
def age = 20
println "Name: $name, Even: $age"
字符串操作
Groovy的字符串支持模板化,可以使用${}来插入变量值:
def greeting = "Hello"
def person = "Bob"
println "${greeting}, ${person}!"
值与引用比较
Groovy中的 ==
对应于Java中使用 equals() 方法
Groovy中的 is 对应于Java中使用 == 进行对象引用比较
```java
String name1 = "Alice"
String name2 = new String( "Alice" )
if (name1 == name2) {// Java中写为 name1.equals(name2)
System.out.println( " equal " );
} else {
System.out.println( " not equal " );
}
if (name1.is(name2)) {// Java中写为 name1 == name2
System.out.println( " identical " );
} else {
System.out.println( " not identical " );
}
// 对应输出结果为:
equal
not identical
数组和循环
Groovy使用[]来创建列表,并支持使用for-in循环遍历数组元素:
def fruits = ["apple", "banana", "cherry"]
for (fruit in fruits) {
println fruit
}
方法定义和调用
def greet(name) {
println "Hello, $name!"
}
greet("Groovy")
在Groovy的方法中return是可选的
public String sayHello() {
return " Hello, Groovy "
}
// 或者
public String sayHello() {
" Hello, Groovy "
}
Groovy 中的方法参数可以具有默认值
// 定义一个带有默认参数的方法
def greet(name = "World") {
println "Hello, $name!"
}
// 调用方法,不提供参数
greet()
// 调用方法,提供参数
greet("Alice")
注释
Groovy中的注释比Java多了首行注释#!,其他与Java相同比如单行注释:// 多行注释:/* / 或者是 支持javadoc的/* */
#! 首行 注释
/*
* 多行注释
*/
/**
* javadoc 注释
*/
// 单行注释
闭包(lambda表达式)
Groovy支持闭包,在 Groovy 中,闭包是一种特殊的对象,它可以被存储在变量中、作为参数传递给方法或者赋值给其他变量。闭包可以捕获其定义时的上下文环境,包括外部变量和方法的引用。我们可以把它看做是一个匿名的函数,可以接收参数,并可以有返回值,通常使用花括号 {}
来定义
// 定义一个简单的闭包
def sayHello = { name ->
println "Hello, $name!"
}
// 调用闭包
sayHello("Alice")
sayHello("Bob")
默认导包
Groovy默认导入了一些常用的包,我们无需显式导入它们
以下的包均为默认导入的包
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.io.*
java.net.*
java.math.BigDecimal
java.math.BigInteger
四、Java集成Groovy
在Java中使用Groovy有三种方式:通过GroovyShell执行Groovy脚本;通过GroovyClassLoader动态加载Groovy Class文件;通过GroovyScriptEngine脚本引擎加载Groovy脚本。
1. 使用GroovyShell执行Groovy脚本
1)引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.groovy/groovy -->
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
<version>4.0.20</version>
</dependency>
2)定义脚本内容并执行
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
public class GroovyShellExample {
public static void main(String[] args) {
// 创建一个Binding对象,用于绑定变量
Binding binding = new Binding();
binding.setVariable("name", "Groovy");
// 创建GroovyShell实例
GroovyShell shell = new GroovyShell(binding);
// 执行Groovy脚本
Object result = shell.evaluate("println('Hello, ' + name + '!'); return name.length();");
// 输出结果
System.out.println("Script result: " + result);
}
}
在调用含有入参的脚本的时候,参数的传递是通过Binding来完成的。
2.GroovyClassLoader动态加载Groovy Class文件
Groovy类(GroovyClass.groovy):
class GroovyClass {
String greet(String name) {
return "Hello, " + name + "!"
}
}
调用示例
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
public class GroovyMethodCallExample {
public static void main(String[] args) throws Exception {
// 创建GroovyClassLoader实例
GroovyClassLoader loader = new GroovyClassLoader();
// 加载Groovy类
Class<?> groovyClass = loader.parseClass(new File("GroovyClass.groovy"));
// 创建Groovy类的实例
GroovyObject groovyObject = (GroovyObject) groovyClass.getDeclaredConstructor().newInstance();
// 调用Groovy方法
String greeting = (String) groovyObject.invokeMethod("greet", "World");
// 输出结果
System.out.println(greeting);
}
}