这里存放着关于书写groovy脚本中遇到的问题(主要)和使用到的技术
文档结构:
- 其他提示和问题
- groovy代码编译相关的问题
- 有用的语言细节/groovy语法糖
- 实现某些功能时需要用到的包和参考文档地址
我使用这个IDE:springsourcetool,基于eclipse的整合产品,提供groovy和grails的插件。在ide环境下,如果不能run as groovy或者java,很可能是因为源文件有问题(但IDE没有提示),无法成功编译。
莫名其妙的错误提示:
- 提示No signature of method:xxx is applicable for argument types: SomeType,但是在下面的Possible solution里,同样签名的方法又被给出了。这可能是那个方法是非静态方法,而你直接通过类而非去调用它了。这个提示本身十二分的莫名其妙。
编译:
1. 命令行编译代码:
- groovyc file.groovy
- java -cp "$GROOVY_HOME/lib/*":. file
2. 编译和引用:
把groovy源文件根据“有没有独立的执行语句”分为两种: 脚本文件和类文件
- 脚本会被编译成同名类,继承自script类, 脚本内的类也被分别编译成同名groovy类,因此,脚本名如果和类名相同,就不能在class{}体外有执行语句
- 引用类的方式:若该类与所属文件同名的,和java一样,或者通过groovyshell.evaluate获得返回的class对象,否则需要确保已经被编译成class;引用脚本的方式,groovyshell.evaluate返回脚本对象,或者使用scriptEngine.run
// 1
import classCompiled
// 2
def groovyScriptEngine = new GroovyScriptEngine(".")
groovyScriptEngine .run("file.groovy", new Binding())
// 3
GroovyShell shell = new GroovyShell(new Binding());
shell.evaluate(new File("file.groovy"))
3. import的类导致无法解析的错误: cannot resovle class:
- 该类不在加载的路径上,groovy在启动时会加载groovy目录下的lib中的类,和用户定义的类目录
- 如果该类是groovy自带的类,那么也可能是groovy的版本较旧
简单直接的增加路径的方式:
- 在conf/groovy-starter.conf中增加load配置
- 在已配置的路径中加入lib
- 在代码中对classLoader增加URL;在命令行中增加classpath参数
语言细节:
1. use的使用能够以可控的方式进行dsl,方法的增加仅限于use块内部,示例代码如下:
class ShellDSL {
// non-thread safe
def static ThreadLocal parentHolder = new ThreadLocal()
def static mv (String src, String dest) {
def srcFile = src.file()
if (dest =~ "/\$")
dest = "$dest${srcFile.name}"
srcFile.renameTo(dest.file())
}
def static file (String file) {
if (parentHolder.get()) {
new File(parentHolder.get(), file)
} else {
new File(file)
}
}
def static dir(String dir, ensure) {
//TODO should replace with seperator
if (!dir =~ "/\$") {dir = "$dir/"}
def d = dir.file()
if (ensure)
d.mkdirs()
d
}
def static ensure(File f) {
f.mkdir()
f
}
def static inDir(String dir ,closure) {
def d = dir.dir()
parentHolder.set(d)
closure.call()
parentHolder.set(null)
}
}
- 用static定义方法
- 方法的第一个参数的类型就是该方法注入的目标类
- 方法使用该类中的其他方法时不需要use块
2. 特殊运算符用法:
- 类型转换使用as, 源类型中需要定义asType(Class klass)的方法
- << 符号对应的是leftShift方法, >>对应rightShift
- 运算符 *. 的意思是依次调用数组中元素的方法,操作返回一个对应结果的数组,效果和collect相同
- &method,方法指针。在对象定义级别使用,和ruby的alias作用相同;在执行流程中使用可以提升代码可读性
as:
def asType(Class r) {
if (r == Registered)
new Registered()
// alternative way
//return {it -> new Registered(name:it.name)}(this)
}
new User() as Registered
<<:
def leftShift(v) {array.add v}
new Queue() << 'mock'
*. :
['cut', 'paste']*.size().each{println it}
&:
class Alias {
def method = {println "method"}
def alias = this.&method // 需要通过对象去引用.因此this不可省略
}
def alias = new Alias()
alias.method()
alias.alias()
def aliasMethod = alias.&alias
aliasMethod()
应用:
1. groovy file 调用接口文档:
点此 :
- 可以进行eachFile, eachDir的操作
- eachXXX有对应的Match版本, 传入一个nameFilter, 根据文件的名字进行filter操作
- eachXXX还对应一个Recurse版本
- 像js中处理ajax请求那样来写代码,虽然其实底层就是基于apache的那个包
client.request(GET, JSON){response, json ->
success: {
.....
.....
}
}
- 如上面所示,格式已经自动转换好了,而且性能不错,至少xml比groovy自带的快
- 适合复杂的场景使用,比较清晰
3. XML构建可以使用MarkupBuiler, 解析可以使用XMLSlurper:
- 最大的好处是dsl风格,代码量少
- 构建如<s.name ...></s.name>的元素,没找到直接简单的方式,我的解决办法是用下划线代替点,然后在实际调用时动态替换回点
4. 并行计算可以考虑
gpars,目前还在不断发展完善中,
将会正式加入下个版本的groovy中:
- 支持actor方式(传数据)和agent方式(传运算), 支持fork/join
- 支持数据流的方式,用户可以不需关注消息和过程,只关注需要的结果数据,数据得不到时block,有点像future.get(),但是支持的数据种类更多
- 据说性能不错,我没深入测试过
- 应用参考链接点击
分享到:
相关推荐
此外,Groovy编译后的字节码与Java兼容,可以在任何Java应用中运行。 7. **工具集成** Groovy常用于构建工具,如Gradle,它的DSL(领域特定语言)使得构建配置更加易读。此外,Groovy Shell和Groovy Console提供...
在Java应用中,只需几行代码,就可以实现Groovy脚本的编译和执行: ```java GroovyShell shell = new GroovyShell(); Script script = shell.parse(new File("path/to/your/groovy/script.groovy")); script.run();...
在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。目前的 Groovy 版本是 1.5.4,在 Java 1.4 和 Java 5 平台上都能使用,也能在 Java 6 上使用。 Groovy 的一个好处是,它的语法...
Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法简洁,减少了代码...
"Groovy的帮助文档"是学习Groovy的重要参考资料,它包含了语言的所有细节和用法,包括语法、类库、工具和最佳实践。通过阅读和实践文档中的示例,开发者可以迅速掌握Groovy的基础和高级特性。 总结起来,Groovy以其...
- **热部署**:当Groovy脚本更新时,无需重新编译或重启Java应用,只需更新数据库中的脚本,Java程序就能即时感知并执行新的逻辑。 - **灵活的业务逻辑**:业务规则可以根据需求快速调整,无需改变Java源码,降低...
Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...
这些特性使得Groovy不仅能够作为脚本语言使用,同时也非常适合于开发大型应用。 #### 二、Groovy与Java的集成 - **跨编译**:通过Groovy的编译器(`groovyc`),Ant任务或者集成开发环境(IDE)的支持,可以将...
Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java Virtual Machine)语言。...在Java生态系统中,Groovy作为一门动态语言,被广泛应用于各种场景,如脚本编写、Web开发以及测试等。
Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了与Java的无缝集成能力,使得它在脚本编写、Web开发、自动化测试等领域有着广泛的应用。 标题“groovy-all”暗示这是一个包含Groovy完整实现的库,通常...
Groovy是一种基于Java虚拟机(JVM)的高级动态编程语言,它在设计时兼顾了简洁性和灵活性,同时也保持了与Java的紧密集成。Groovy SDK 2.4.7是该语言的一个版本,提供了完整的开发工具包,包括编译器、解释器和其他...
Groovy SDK 4.0.3 是一个针对Groovy编程语言的软件开发工具包,它包含了Groovy语言的运行环境和开发所需的各种组件。Groovy是一种动态、灵活的面向对象编程语言,它与Java语法兼容,但提供了更简洁的语法和更强的...
Groovy脚本语言是一种强大的、动态的编程语言,它与Java平台紧密集成,可以在Java虚拟机(JVM)上运行。Groovy结合了面向对象编程(OOP)、函数式编程和脚本语言的特性,提供了简洁、易于阅读的语法,使得开发人员...
Groovy是一种动态、类型安全的编程语言,专为Java虚拟机(JVM)设计,它在Java生态系统中扮演着重要角色。Groovy结合了面向对象编程(OOP)、函数式编程(FP)以及脚本语言的简洁性,使得开发者能够更高效地编写代码...
4. **在项目中的应用**:Groovy可以作为中小型项目的替代语言,也可以嵌入到大型Java项目中,增加代码的灵活性。 **Groovy的特性:** 1. **可选的动态类型**:Groovy支持动态类型,这意味着变量的类型可以在运行时...
Groovy是一种基于Java平台的、动态的、强大的编程语言,它融合了面向对象编程、函数式编程和静态类型检查的能力,为开发者提供了简洁、高效的语法,使得编写Java虚拟机(JVM)上的应用程序变得更加容易和快捷。...