`
白黑山河
  • 浏览: 47315 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

groovy的琐碎记录(错误提示,编译,语言细节及应用)

阅读更多

这里存放着关于书写groovy脚本中遇到的问题(主要)使用到的技术

 

文档结构

  1. 其他提示和问题
  2. groovy代码编译相关的问题
  3. 有用的语言细节/groovy语法糖
  4. 实现某些功能时需要用到的包和参考文档地址

 

我使用这个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. 命令行编译代码:
  1. groovyc file.groovy
  2. java -cp "$GROOVY_HOME/lib/*":.  file

2. 编译和引用:
把groovy源文件根据“有没有独立的执行语句”分为两种: 脚本文件和类文件
  1. 脚本会被编译成同名类,继承自script类, 脚本内的类也被分别编译成同名groovy类,因此,脚本名如果和类名相同,就不能在class{}体外有执行语句
  2. 引用类的方式:若该类与所属文件同名的,和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的版本较旧
简单直接的增加路径的方式:
  1. 在conf/groovy-starter.conf中增加load配置
  2. 在已配置的路径中加入lib
  3. 在代码中对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)
    }
}
 
  1. 用static定义方法
  2. 方法的第一个参数的类型就是该方法注入的目标类
  3. 方法使用该类中的其他方法时不需要use块
2.  特殊运算符用法:
  1.  类型转换使用as, 源类型中需要定义asType(Class klass)的方法
  2. << 符号对应的是leftShift方法, >>对应rightShift
  3. 运算符 *. 的意思是依次调用数组中元素的方法,操作返回一个对应结果的数组,效果和collect相同
  4. &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版本

2. Http请求可以使用httpBuilder包,优点:
  • 像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应用(基本操作)

    此外,Groovy编译后的字节码与Java兼容,可以在任何Java应用中运行。 7. **工具集成** Groovy常用于构建工具,如Gradle,它的DSL(领域特定语言)使得构建配置更加易读。此外,Groovy Shell和Groovy Console提供...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    在Java应用中,只需几行代码,就可以实现Groovy脚本的编译和执行: ```java GroovyShell shell = new GroovyShell(); Script script = shell.parse(new File("path/to/your/groovy/script.groovy")); script.run();...

    精通 Groovy--下一代开发语言

    在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。目前的 Groovy 版本是 1.5.4,在 Java 1.4 和 Java 5 平台上都能使用,也能在 Java 6 上使用。 Groovy 的一个好处是,它的语法...

    Groovy入门教程[参照].pdf

    Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法简洁,减少了代码...

    groovy

    "Groovy的帮助文档"是学习Groovy的重要参考资料,它包含了语言的所有细节和用法,包括语法、类库、工具和最佳实践。通过阅读和实践文档中的示例,开发者可以迅速掌握Groovy的基础和高级特性。 总结起来,Groovy以其...

    Java调用Groovy,实时动态加载数据库groovy脚本

    - **热部署**:当Groovy脚本更新时,无需重新编译或重启Java应用,只需更新数据库中的脚本,Java程序就能即时感知并执行新的逻辑。 - **灵活的业务逻辑**:业务规则可以根据需求快速调整,无需改变Java源码,降低...

    java 动态脚本语言 精通 Groovy

    Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...

    groovy速查手册

    这些特性使得Groovy不仅能够作为脚本语言使用,同时也非常适合于开发大型应用。 #### 二、Groovy与Java的集成 - **跨编译**:通过Groovy的编译器(`groovyc`),Ant任务或者集成开发环境(IDE)的支持,可以将...

    groovy-2.3.6-installer

    Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java Virtual Machine)语言。...在Java生态系统中,Groovy作为一门动态语言,被广泛应用于各种场景,如脚本编写、Web开发以及测试等。

    groovy-all

    Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了与Java的无缝集成能力,使得它在脚本编写、Web开发、自动化测试等领域有着广泛的应用。 标题“groovy-all”暗示这是一个包含Groovy完整实现的库,通常...

    Groovy-sdk-2.4.7

    Groovy是一种基于Java虚拟机(JVM)的高级动态编程语言,它在设计时兼顾了简洁性和灵活性,同时也保持了与Java的紧密集成。Groovy SDK 2.4.7是该语言的一个版本,提供了完整的开发工具包,包括编译器、解释器和其他...

    groovy-sdk-4.0.3

    Groovy SDK 4.0.3 是一个针对Groovy编程语言的软件开发工具包,它包含了Groovy语言的运行环境和开发所需的各种组件。Groovy是一种动态、灵活的面向对象编程语言,它与Java语法兼容,但提供了更简洁的语法和更强的...

    groovy脚本语言bin

    Groovy脚本语言是一种强大的、动态的编程语言,它与Java平台紧密集成,可以在Java虚拟机(JVM)上运行。Groovy结合了面向对象编程(OOP)、函数式编程和脚本语言的特性,提供了简洁、易于阅读的语法,使得开发人员...

    groovy包及相关学习资料

    Groovy是一种动态、类型安全的编程语言,专为Java虚拟机(JVM)设计,它在Java生态系统中扮演着重要角色。Groovy结合了面向对象编程(OOP)、函数式编程(FP)以及脚本语言的简洁性,使得开发者能够更高效地编写代码...

    groovy经典_资料

    4. **在项目中的应用**:Groovy可以作为中小型项目的替代语言,也可以嵌入到大型Java项目中,增加代码的灵活性。 **Groovy的特性:** 1. **可选的动态类型**:Groovy支持动态类型,这意味着变量的类型可以在运行时...

    apache-groovy-sdk-3.0.6.zip

    Groovy是一种基于Java平台的、动态的、强大的编程语言,它融合了面向对象编程、函数式编程和静态类型检查的能力,为开发者提供了简洁、高效的语法,使得编写Java虚拟机(JVM)上的应用程序变得更加容易和快捷。...

Global site tag (gtag.js) - Google Analytics