Groovy Tip 33 方法的参数 二
Map参数是我们在Groovy语言的编码中比较常用的一种参数类型,我们常常会很自然的写出来如下的代码:
t.testMap(a:1)
t.testMap(a:1,b:1)
t.testMap(a:1,b:1,c:1)
new Person(name:'Tom',sex:23)
这些都是Map参数的使用。以此类推,我们也常常希望List参数也有同样的功能,比如,我们有如下的一个以List对象为参数的方法:
class Testor2 {
def testList(List list)
{
println list
}
}
然后,我们写了如下的测试:
def t = new Testor2()
t.testList(1,2,3)
我们热切的期望这样的代码能够正常运行,很可惜的是,上面的代码会报如下的错误:
Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: str.Testor2.testList() is applicable for argument types: (java.lang.Integer, java.lang.Integer, java.lang.Integer) values: {1, 2, 3}
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:54)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:59)
不过不要灰心,其实,我们的数组参数拥有这样的功能。比如,我们有如下的一个以数组为参数的方法:
class Testor2 {
def testArray(int[] arrs)
{
println arrs
}
}
这样,我们就可以写出如下的测试:
def t = new Testor2()
t.testArray(1,2,3)
运行结果为:
[1, 2, 3]
Groovy语言中的方法还有一个值得注意的变化是动态方法名的现象。比如,我们可以以如下的方式调用一个方法:
t."function_name"()
这种使用方式我们应该已经司空见惯了。但是,这里面隐藏着一个比较有意思的问题,就是,我们可以在方法名中出现"."和"-"这样的一些字符,这在正常的方法名中是不可能出现的。
比如,我们有如下的一个方法:
class Testor2 {
def "a.b"()
{
println 'haha'
}
}
这也是可以正常编译的。而且我们可以这样调用它:
def t = new Testor2()
t."a.b"()
运行结果为:
haha
有了这样的概念,下次如果我们遇到如下的代码,就不用惊慌了:
def web = builder.'web-app' {
builder.'display-name'('Groovy WebApp')
}
分享到:
相关推荐
在需要将多个数组合并为单一数组时,Groovy的`flatten`方法显得尤为强大。相比于Java中可能需要用到`ArrayList`的`addAll`方法,Groovy允许直接对数组列表进行扁平化操作,如: ```groovy def list1 = ['a', 'b', '...
2. **方法2:反射动态调用** - 使用Java的反射机制,可以在运行时动态加载和执行Groovy类。这种方法的优点是Groovy脚本的修改不需要重新编译整个项目,因为Java代码可以通过反射动态地找到并调用Groovy方法。这里,...
本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...
### Groovy和Grails配置方法 #### 一、Groovy与Grails简介 Groovy是一种强大的面向对象编程语言,它运行在Java平台上,并且能够直接与Java代码进行交互。Groovy支持函数式编程特性,拥有丰富的语法糖以及简洁的...
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 ) https://hanshuliang.blog.csdn.net/article/details/122815793 博客源码
3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...
2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的ClassLoader,能解析Groovy源码并生成字节码。 3. 加载并执行Groovy脚本:通过GroovyClassLoader的`parseClass()`方法...
此外,可以使用`putAll(map2)`方法将一个Map的所有键值对复制到另一个Map中,如`explicitMap = new TreeMap(); explicitMap.putAll(map)`。 比较Map是否相等,可以使用`==`运算符,它会检查两个Map的键值对是否完全...
闭包在Groovy中的定义形式通常为`{参数列表 -> 代码块}`。闭包的this指针在闭包内部指向创建它的上下文对象,而`@delegate`注解可以将闭包的未定义方法委托给外部对象处理。 函数式编程在Groovy中也得到了很好的...
Groovy闭包可以像方法一样被调用,也可以作为参数传递给其他方法。闭包中可以自由地访问它被创建时作用域中的变量(闭包的自由变量)。这为Groovy的编程提供了很大的灵活性,例如可以轻松实现事件监听、回调函数、...
- **方法默认参数和命名参数**:Groovy允许方法定义默认参数值,并通过键值对的方式调用方法。 - **元编程**:Groovy支持元编程,可以在运行时修改类和对象的行为。 8. **学习资源**: - 官方文档:Groovy官方...
#### 二、Groovy脚本的特点 1. **与Java的高度兼容性**:Groovy可以无缝地与Java代码集成,可以在Groovy脚本中直接调用Java类库。 2. **动态类型**:Groovy采用了动态类型系统,变量无需显式声明类型。 3. **闭包...
在Groovy中,动态方法是通过元编程(Metaprogramming)实现的,这使得我们可以在运行时修改或添加类的行为。元编程在Groovy中主要通过`MetaClass`接口和`ExpandoMetaClass`类来实现。 `MetaClass`是Groovy中的一个...
#### 二、Groovy与Java的集成 - **跨编译**:通过Groovy的编译器(`groovyc`),Ant任务或者集成开发环境(IDE)的支持,可以将Groovy代码与Java代码一起编译。这样做的好处在于,你可以像使用Java代码一样使用...
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
文档还提供了一些基本的运行和编辑Groovy代码的方法,并且提到了Groovy的IDE和编辑器支持情况,以及一些Groovy的基础知识,如类和对象的声明、使用脚本、处理文本、数字、列表、映射和范围,以及如何在Java环境中...
Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java Virtual Machine)语言。Groovy结合了Python、Ruby和Perl等脚本语言的简洁性和灵活性,并且完全兼容Java,可以无缝地与Java代码集成。在"groovy-...
groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2
- **Expression**: 使用Groovy脚本语言编写,以解析方法参数: ``` groovyScript("def result=''; def stop=false; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]','').split(',').toList(); if (params...