Welcome everyone

groovy学习笔记

java 汪明鑫 144浏览 0评论

公司的对账平台以及一些内部工具有用到groovy脚本

简单学习和记录下

groovy介绍

https://groovy-lang.org/

官方话:

Groovy是一种基于JVM,功能强大、类型可选(默认是弱类型的,也可以通过注解开启类型检测)、动态的,可与Java无缝衔接的编程语言。

大白话:

Groovy是可以Java直接调用的高效的脚本语言

如果将Java语言比作老虎,那么Groovy就是翅膀,二者配合起来,就是如虎添翼

Groovy编译为java字节码,还扩充了Java API类库,要部署Groovy,只需要引入Groovy的一个Jar包。

几乎所有的java代码都可以拿来当作groovy代码来执行。

groovy也默认引用了Java的一些库

groovy零几年就诞生了

groovy环境

下载groovy

https://groovy.jfrog.io/ui/native/dist-release-local/groovy-zips/apache-groovy-sdk-4.0.16.zip

解压

配置环境变量

export PATH=$PATH:/Users/xinye/Documents/software/groovy-4.0.16/bin

idea配置安装groovy插件

groovy maven依赖

<dependency>
			<groupId>org.codehaus.groovy</groupId>
			<artifactId>groovy-all</artifactId>
		</dependency>

实践

public static void testGroovy1(){
        GroovyShell groovyShell = new GroovyShell();
        groovyShell.evaluate("print 'a'");
    }
public static void testGroovy2() throws IOException {
        Binding binding = new Binding();
        GroovyShell shell = new GroovyShell(GroovyShellHelper.class.getClassLoader(), binding);
        File file = new File("xinye-component/src/main/java/pers/wmx/utils/test.groovy");
        shell.evaluate(file);
    }

对脚本md5加密下

public static Object evaluate(String scriptStr) {
        // 使用md5, 避免每次都编译groovy
        String scriptFp = DigestUtils.md5Hex(scriptStr);
        Script script = scriptMap.computeIfAbsent(scriptFp, fp -> new GroovyShell().parse(scriptStr));

        Binding binding = new Binding();
        script.setBinding(binding);
        return script.run();
    }

核心语法

package pers.wmx.utils

// 核心语法

//定义变量
def x = 2
//打印
println x
/*
不同类型也可以赋值
*/
x = "hello"
println x
msg = "world"
println "hello " + msg //hello world
println 3 / 2    // 1.5
println 3 // 2   // 3
println 3 % 2    // 1
println 3 * 2  // 6
println 3 + 2  // 5
println 3 ** 2  // 9
println  3 == 3  //true
String str = "Hello"
str = 2.3
////////////////////////////////////////////////////////////////////////
//列表
def list = []
a = list.add("Java");
println a //true
println list //[Java]
list << "F#"
println list //[Java, F#]
println list.remove("F#") //true
println list //[Java]
println list - "Java"  // []
list.addAll(["java","C#"])
list.each { println "$it"}
/*
Java
java
C#
*/
list.eachWithIndex { it, i -> println "$i: $it"}
/*
0: Java
1: java
2: C#
*/
ele = list.contains( 'java' )
println ele //true
println 'java' in list  //true
Collections.replaceAll(list,"java","Groovy")
println list //[Java, Groovy, C#]
////////////////////////////////////////////////////////////////////////
//定义map类型
def myMap = [:]
myMap.put("XH",'123')
myMap.put("Name",'Jack')
myMap.each { println "$it.key: $it.value" }
myMap.eachWithIndex { it, i -> println "$i: $it"}
/*
XH: 123
Name: Jack
0: XH=123
1: Name=Jack
*/
println myMap.containsKey('Name') //true
println myMap.containsValue('jack') // false 区分大小写
println myMap.keySet() //[XH, Name]
println myMap.values() //[123, Jack]
//for迭代map
x = ""
for ( e in myMap ) {
    x += e.value
    x += " "
}
println x
////////////////////////////////////////////////////////////////////////
//函数定义
def sayMsg(msg="Groovy"){
    "Hello,$msg"
}
println sayMsg() //Hello,Groovy
println sayMsg('Java') //Hello,Java
////////////////////////////////////////////////////////////////////////
//if分支
def func_if(x = 0){
    if(x< 0) {
        println "<0"
    } else if(x<20) {
        println "[0,20)"
    } else {
        println ">20"
    }
}
println func_if(20) //null
//for循环
def func_for(){
    def x = 0
    for (i in 0 .. 10) {
        x += i
    }
    println x //55
    x = 0
    for( i in [1,2,3,4,5,6,7,8,9,10] ) {
        x += i
    }
    println x // 55
}
func_for()
////////////////////////////////////////////////////////////////////////
//Expando动态Bean类型,支持添加属性和方法
def user = new Expando(name:"Jack")
println user //{name=Jack}
user.xh = "123"
println user //{name=Jack, xh=123}
user.info = {
    println "Name: $name,XH:$xh"
}
user.info() //Name: Jack,XH:123
////////////////////////////////////////////////////////////////////////
//扩展方法 和 Metaprogramming
String.metaClass.xxxFunc = {
    println "xxxFunc"
}
"str"?.xxxFunc() //xxxFunc
////////////////////////////////////////////////////////////////////////
class TestGroovyInterceptable implements GroovyInterceptable {
    def sum(Integer a, Integer b) { a + b }

    def invokeMethod(String name, args) {
        println "Invoke method: $name,args: $args"
    }
}
def test = new TestGroovyInterceptable()
//Invoke method: sum ,args: [2, 3]
test?.sum(2,3)
//Invoke method: power,args: [2, 3]
test?.power(2,3)
////////////////////////////////////////////////////////////////////////
//import groovy.transform.TypeChecked
////类型检测
//@TypeChecked
//Integer testTypeCheck() {
//    //[Static type checking] -
//    //Cannot assign value of type java.lang.String to variable of type java.lang.Integer
//    Integer num = "1"
//    return num
//}
////////////////////////////////////////////////////////////////////////
import groovy.transform.CompileStatic
//静态方法
@CompileStatic
int sum(int x, int y) {
    x + y
}
sum(2,7) //9
////////////////////////////////////////////////////////////////////////
//类
class Student {
    //只读
    final String name = "Jack"
    Integer age = 0
    protected void setAge(Integer age) {
        this.age = age
    }
    def info(){
        "$name,$age,$tag"
    }
    //动态类型
    def tag
}
def stu = new Student()
stu.setAge(33)
stu.tag = [1,2,3]
println stu.info() //Jack,33,[1, 2, 3]
////////////////////////////////////////////////////////////////////////
//JSON处理
import groovy.json.JsonOutput
def strJSON = JsonOutput.toJson([stu])
println(strJSON) //[{"age":33,"tag":[1,2,3],"name":"Jack"}]
////////////////////////////////////////////////////////////////////////
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "name": "Jack", "xh" : "123"}')
println(object.name)
println(object.xh)

闭包

package pers.wmx.utils

def a = {
    print "32"
}

def method(Closure closure) {
    closure()
}

method(a)  // 跑脚本打印 32

package pers.wmx.utils

def a = {
    v -> println("${v}")
}

def method(Closure closure, def val) {
    closure(val)
}

method(a, "666")  // 跑脚本打印 666

Gradle

Gradle使用Groovy、Kotlin等语言编写自定义脚本,取代了Ant和Maven使用xml配置文件的方式,简化了开发时对项目构建要做的配置。

演进:

  1. 石器时代:自己编写命令脚本,进行编译和打包
  2. 蒸汽时代:Make、Ant工具的出现
  3. 电气时代:Maven
  4. 信息时代:Gradle

Gradle 作为现代的自动化工具,帮助开发者构建项目、打包等自动化处理。

  1. 轻松的可扩展性
  2. 采用了 Groovy
  3. 强大的依赖管理
  4. 灵活的约定
  5. Gradle Wrapper
  6. 可以和其他构建工具继承
  7. 底层 API
  8. 社区的支持和推动

转载请注明:汪明鑫的个人博客 » groovy学习笔记

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz