Groovy For Mac是款适合编程人员们使用的JVM开发语言工具。Groovy For Mac最新版拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。并且Groovy For Mac还可以支持对对象进行布尔求值,支持函数式编程,不需要main函数。
{mac1}
软件功能
1、一些新的运算符。
2、默认导入常用的包。
3、断言不支持jvm的-ea参数进行开关。
4、支持对对象进行布尔求值。
5、支持函数式编程,不需要main函数。
6、类不支持default作用域,且默认作用域为public。
7、groovy中基本类型也是对象,可以直接调用对象的方法。
8、受检查类型异常(Checked Exception)也可以不用捕获。
9、支持单元测试和模拟(对象),可以 简化测试。
10、无缝集成 所有已经存在的 Java对象和类库。
11、 Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。
12、在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。
13、直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
14、 构建在强大的Java语言之上 并 添加了从Python,Ruby和Smalltalk等语言中学到的 诸多特征,例如动态类型转换、闭包和元编程(metaprogramming)支持。。
15、为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
16、 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让代码变得易于阅读和维护。
软件优势
1、语法简洁,可读性强,并且很容易上手
2、集成性强,与Java语言或者一些第三方库无缝接入
3、脚本测试,可以写一些简单的、可维护的测试用例,来完成自动化构建任务
4、功能强大,具有闭包特性,自动构建,元编程,函数式编程,Optional类型以及静态编译的功能
5、DSL语言编写,语法灵活,扩展性强,使项目具有高级配置与可定制的机制,可读性强的特点
6、完整的生态系统,涉及Web开发、reactive应用,并发性、异步的库、测试框架、构建工具(Build Tools)、代码分析、GUI构建
常见问题
问:为什么Groovy For Mac每执行一次脚本,都会生成一个脚本对应的class对象?
答:一个ClassLoader对于同一个名字的类只能加载一次,都由GroovyClassLoader加载,那么当一个脚本里定义了C这个类之后,另外一个脚本再定义一个C类的话,GroovyClassLoader就无法加载了。为什么这里会每次执行都会加载?
这是因为对于同一个groovy脚本,groovy执行引擎都会不同的命名,且命名与时间戳有关系。当传入text时,class对象的命名规则为:"script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy"。这就导致就算groovy脚本未发生任何变化,每次执行parse方法都会新生成一个脚本对应的class对象,且由GroovyClassLoader进行加载,不断增大perm区。
问:Groovy For Mac为什么InnerLoader加载的对应无法通过gc清理掉?
答:大家都知道,JVM中的Class只有满足以下三个条件,才能被GC回收,也就是该Class被卸载:1. 该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例;2. 加载该类的ClassLoader已经被GC;3. 该类的java.lang.Class对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法。
在GroovyClassLoader代码中有一个class对象的缓存,进一步跟下去,发现每次编译脚本时都会在Map中缓存这个对象,即:setClassCacheEntry(clazz)。每次groovy编译脚本后,都会缓存该脚本的Class对象,下次编译该脚本时,会优先从缓存中读取,这样节省掉编译的时间。这个缓存的Map由GroovyClassLoader持有,key是脚本的类名,这就导致每个脚本对应的class对象都存在引用,无法被gc清理掉。