Groovy与Grails:动态编程与Web开发的利器
立即解锁
发布时间: 2025-08-18 01:08:33 阅读量: 1 订阅数: 3 

# Groovy与Grails:动态编程与Web开发的利器
## 1. Groovy中的方法与属性操作
### 1.1 检查方法是否存在
在Groovy中,我们可以通过不同方式检查一个方法是否存在。例如,对于以下`Person`类:
```groovy
class Person{
String firstname
String lastname
}
def p = new Person()
```
在Groovy 1.5及以上版本,我们可以使用`MetaClass`的`respondsTo`方法来动态验证方法的存在性:
```groovy
if(p.metaClass.respondsTo(p, "getFirstname")){
println p.getFirstname()
}
```
而在Groovy 1.0版本,我们可以查询类的方法列表来实现相同的功能:
```groovy
def list = p.class.methods as List
if(list.contains("getFirstname")){
p.getFirstname()
}
```
### 1.2 检查重载方法
当类中存在重载方法时,我们可以向`respondsTo`方法传递额外的参数来检查特定的重载方法。例如,对于`Greeting`类:
```groovy
class Greeting{
def sayHello(){
println "Hello, Stranger"
}
def sayHello(String name){
println "Hello, ${name}"
}
}
def g = new Greeting()
if(g.metaClass.respondsTo(g, "sayHello", null)){
g.sayHello()
}
if(g.metaClass.respondsTo(g, "sayHello", String)){
g.sayHello("Jane")
}
```
以下是检查`Greeting`类中`sayHello`方法数量及参数类型的代码:
```groovy
println "Number of sayHello() methods: " +
g.metaClass.respondsTo(g, "sayHello").size()
g.metaClass.respondsTo(g, "sayHello").each{m ->
println "${m.name} ${m.nativeParameterTypes}"
}
```
### 1.3 创建字段指针
在Groovy中,我们可以通过在字段名前加`@`来绕过封装直接访问字段。例如:
```groovy
class Person{
String name
String getName(){
"My name is ${name}"
}
}
def p = new Person()
p.name = "Jane"
println p.name
println p.@name
```
### 1.4 创建方法指针
Groovy允许我们使用`&`前缀创建方法指针。例如:
```groovy
def list = []
def insert = list.&add
insert "Java"
insert "Groovy"
println list
```
### 1.5 调用不存在的方法(invokeMethod)
`invokeMethod`是Groovy元编程的核心。通过它,我们可以动态处理不存在的方法调用。例如:
```groovy
class Person{
String name
Map relationships = [:]
Object invokeMethod(String what, Object who){
if(relationships.containsKey(what)){
who.each{thisPerson ->
relationships.get(what).add(thisPerson)
}
}
else{
relationships.put(what,who as List)
}
}
}
def scott = new Person(name:"Scott")
scott.married "Kim"
scott.knows "Neal"
scott.workedWith "Brian"
scott.knows "Venkat"
scott.workedWith "Jared"
scott.knows "Ted", "Ben", "David"
println scott.relationships
```
### 1.6 创建Expando对象
`Expando`对象是空白的对象,可以动态添加字段和方法。例如:
```groovy
def e = new Expando()
e.latitude = 70
e.longitude = 30
println e
e.areWeLost = {->
return (e.longitude != 30) || (e.latitude != 70)
}
e.areWeLost()
e.latitude = 12
e.areWeLost()
e.goNorth = { howMuch ->
e.latitude += howMuch
}
println e.latitude
e.goNorth(20)
```
### 1.7 动态添加方法到类(Categories)
通过
0
0
复制全文
相关推荐










