Groovy In Action 笔记 (1) -- 概述

1. 基于JVM的一种强类型的动态语言,因此可以在同一个项目中与Java混合使用.

2. 可以使用Groovyc编译为 .class 文件,与Java一致(Javac编译 .java文件为 .class文件).

3. 除了将.groovy文件编译为.class 文件,groovy提供了另一种方式将groovy内容加载到jvm供JIT编译:通过groovy class loader直接加载 .groovy 文件.

  

4. Groovy是如何实现动态语言特性的? 相当于在Java语言基础上加了一层MOP(Meta Object Protocol), 可以理解为Groovy中的任何方法/属性调用均被中间层根据某些规则(系统定义,或者用户定义均可)进行了处理,处理后再调用实际的方法/属性,比如:当调用某个实例中不存的方法时,中间层可以将此不存在的方法(根据规则)转变为某个已经存在的方法,得到另一个结果.此特性配合groovy中的closure+map可以创造一些领域特性语言(DSL),如Gradle,Jenkins-Pipeline等.

  

5. Groovy编译器编译Groovy脚本时,并不是逐行进行,而是全文解析成AST(抽象语法树),然后写成.class文件.这与Python等脚本语言的解释器的逐行解释不同.

6. Groovy脚本可以有三种不同的代码形式:

(1) 脚本中定义唯一一个与脚本文件同名的class,并含有一个static void main(String[] args)方法,和Java一致

(2) 脚本文件中没有class定义,只有一些groovy代码

(3) 脚本文件中既有class定义,且class的名字与脚本名字不同,也有常规的groovy语句

7. Groovy所有的类均实现了GroovyObject接口(相当有java中所有类均继承自Object类). groovyc编译 .groovy 文件后,会自动实现此接口.Groovy中的所有方法调用(第四点提到的中间层) 正是通过GroovyObject中的invokeMethod方法,配合MetaClassRegistry等实现的.具体逻辑后续详细介绍.

原文地址:https://www.cnblogs.com/FsharpZack/p/13773087.html