groovy学习

最近因为项目上用到了gradle,但是这个使用了groovy,所以需要学习这个,记录一下学习的心得。

首先,groovy依赖于 jdk,是在 jdk基础上诞生的一门语言。环境如下

groovy sdk 3.0.25,jdk 1.8.0-292

代码示例

源文件

复制代码
//Execute.groovy

println "git help".execute().text

println "cmd /C dir".execute().text

编译源文件

复制代码
groovyc Execute.groovy

使用jd-gui查看class文件

复制代码
import groovy.lang.Binding;
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import groovy.lang.Script;
import java.lang.ref.SoftReference;
import org.codehaus.groovy.reflection.ClassInfo;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
import org.codehaus.groovy.runtime.callsite.CallSiteArray;

public class Execute extends Script {
  public Execute() {}
  
  public Execute(Binding context) {
    super(context);
  }
  
  public static void main(String... args) {
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    arrayOfCallSite[0].callStatic(InvokerHelper.class, Execute.class, args);
  }
  
  public Object run() {
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    arrayOfCallSite[1].callCurrent((GroovyObject)this, arrayOfCallSite[2].callGetProperty(arrayOfCallSite[3].call("git help")));
    return arrayOfCallSite[4].callCurrent((GroovyObject)this, arrayOfCallSite[5].callGetProperty(arrayOfCallSite[6].call("cmd /C dir")));
  }
}

可以看到,最终编译后的代码还是一个完整的java类,通过main函数调用了InvokerHelper,最后调用run()执行实际逻辑,只是在编译期间进行了字节码增强,感觉跟一些开源的工具包(apache commons)有点类似,其实groovy的简洁就是在java的基础上进行封装的体现。

Groovy可以看作是运行在Java平台上的一个"语言级开源库"。

|----------|----------------------|---------------------|
| 维度 | Groovy | 开源库(Apache Commons) |
| 核心机制 | 编译时生成CallSite等支持代码 | 提供工具类和方法 |
| 对Java的增强 | 语法级、API级、运行时级增强 | API级增强为主 |
| 使用方式 | 有自己的语法,编译为.class | 在Java代码中调用 |
| 最终目标 | 让Java开发更简洁高效 | 让特定任务更简单 |

groovy与开源库的集成层级不同

|--------|-----------------------------|---------------------|
| 维度 | Groovy | 开源库(Apache Commons) |
| 集成深度​ | 语言层面(编译器+运行时) | 库层面(字节码/运行时) |
| 语法影响 | 有自己的语法 | 使用Java语法 |
| 编译过程 | 有独立的编译阶段 | 随Java一起编译 |
| 运行时依赖​ | Groovy运行时(groovy-all.jar) | 自身的jar包 |

相关推荐
ThsPool17 分钟前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
0566462 小时前
Python康复训练——常用标准库
开发语言·python·学习
极光代码工作室2 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen2 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
0566462 小时前
Python康复训练——控制流与函数
开发语言·python·学习
名字还没想好☜3 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫3 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao3 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬4 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛4 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流