基础知识
参考教程
gradle导包:compile “:groovy-all:${groovyVersion}”
对java的拓展
- 动态性
单纯的java语言是不具有动态性的,groovy恰恰弥补了这一缺憾,有了groovy你可以在程序运行时任意修改代码逻辑,不需要重新发布,groovy的弱类型让你不用再面对各种类型转换问题。 - 语法糖
groovy在语法上兼具java 语言和脚本语言特点,大大简化了语法。
3.使用groovy加强项目的动态性
对java开发者而言,在做项目的时候往往会碰到这类问题:某一部分的功能需要经常做修改或者添加,如果要使用hard code项目就要频繁的进行发布上线,在一个成熟的系统中这种事情显然是不被允许的。那么就要考虑如何才能实现不去进行代码的重新发布项目就能实现系统功能的修改呢?以下列出三种方式:
- 把经常需要修改的系统配置写进数据库,在需要修改配置时只要修改数据库参数就行了。
- 使用规则引擎,如drools
- 使用groovy
如果使用数据库配置的方法,实际上可以说几乎每个系统里多多少少都会有这种实现,这种方式比较适合用于把比较简单的数据字段写进数据库,在代码运行时读取数据库得到配置字段,达到更改运行时行为的目的,这种方式虽然很通用也很常用,但是这种方式只适用于比较简单的配置,当需要变动的地方比较复杂要涉及到逻辑变动的时候这种方式就不再适用了。
使用drools可以包含逻辑,而且性能也很好。但是也有一个问题,就是学习成本。java开发者如果想把自己的代码写进drools,是需要费一点力气才行的,而且还有一个严重的问题就是drools里边的代码无法调试,不管开发还是维护起来都会很头疼。
而groovy好的地方就是,java开发者可以无缝的进行groovy开发,甚至直接将java代码拷贝到groovy就能够运行。groovy支持直接读取String运行,这意味着可以把java代码以字符串的形式写进数据库,然后在运行时动态的读出来执行,数据库里边的代码逻辑可以随便修改,修改之后可以不用发布立即生效。而且同一套代码可以在本地进行debug,在发生异常时和普通的java代码没有区别。
下面是我做测试用的groovy代码,体会一下
- groovy类解析
import
//注意: 与.java结尾的类不同,这个类文件是以.groovy结尾的
class a{
static void main(String[] args) {
String scriptStr = "def b(){ println \"I am grovy script b\" }\n" +
"void c(){println \"I am grovy script c\"}\n" +
"private d(){println \"I am grovy script d\"}\n" +
"def e(int param = 1000){println \"I am grovy script e param default value is \"+param}\n" +
"String f(){return \"return from method\"}"
GroovyClassLoader classLoader = new GroovyClassLoader()
Class<?> ruleClazz = (scriptStr)
Script script = (ruleClazz, new Binding())
println scriptStr
println()
("b",null)
("c",null)
("d",null)
("e",null)
println ("f",null)
}
}
运行结果:
def b(){ println "I am grovy script b" }
void c(){println "I am grovy script c"}
private d(){println "I am grovy script d"}
def e(int param = 1000){println "I am grovy script e param default value is "+param}
String f(){return "return from method"}
I am grovy script b
I am grovy script c
I am grovy script d
I am grovy script e param default value is 1000
return from method
- groovy表达式解析
import
class a{
static void main(String[] args) {
//自定义脚本
CompilerConfiguration cfg = new CompilerConfiguration()
(())
def shell = new GroovyShell(cfg)
def script = ("print 'value ' + value + ' 为:' \n value>0?'正数':'负数'")
def binding = new Binding()
(binding)
("value",-1)
println ()
("value",3)
println ()
//内置脚本示例
println (1, 2, 3, "x + y * z")//简单的表达式脚本,对GroovyShell的包装
}
}
结果:
value -1 为:负数
value 3 为:正数
7
String完全可以存入数据库,在运行时读出来再运行(当然考虑到效率问题最好对脚本做缓存)。这样只要修改数据库中的代码就可以动态修改项目的行为了。