Groovy探索之MOP 二 对类属性的各种操作
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
我们谈到MOP,即“元对象协议”,就是对类或对象的各个元素,如名称、方法、属性等等,在运行期进行实时变化,如修改方法名、属性名,动态增加方法、属性等等的一类编程的统称。
比如前面我们所谈到过的“invokeMethod”和“methodMissing”两个方法,就可以用来使得我们在运行期动态的给一个类增加方法,值得注意的是,这种增加是类级别的,即一个类所有的对象都可以增加方法。
既然说过了在运行期给一个类动态的增加方法,那么相应的,在运行期给一个类动态的增加属性就是我们接着要考虑的事情。
我们都知道,在Java语言中,对属性的操作是通过属性对应的“get”和“set”方法进行的;而在Groovy语言中,对属性的操作则是通过Gpath进行的,这使得我们对于GroovyBean类的编程来说,不管是编写GroovyBean类,还是访问GroovyBean对象的属性,都比Java语言的JavaBean来的简单得多。
比如我们有如下的一个GroovyBean:
class Employee
{
String id
String name
}
我们现在将它初始化:
def empl1 = new Employee(id:'00001',name:'Tom')
现在我们就可以通过Gpath来访问它的属性了:
println empl1.name
当然,所谓Gpath访问,即通过“.”操作符访问,如“empl1.name”并不是直接访问“empl1”对象的“name”属性,而是通过“Employee”类隐含实现了的“get”和“set”方法来访问的。明白了这个道理,我们就可以自由的给GroovyBean类或者对象添加属性了。请先看下面的例子:
class Employee
{
String id
String name
def getAge()
{
'everyone is 24'
}
}
可以看到,我们并没有给“Employee”类定义“age”属性,但是我们实现了“getAge”方法,我们就可以通过Gpath来访问“age”属性,请看下面的代码示例:
def empl1 = new Employee(id:'00001',name:'Tom')
println empl1.name
println empl1.age
运行结果为:
Tom
everyone is 24
当然了,我们谈到了是MOP,就是要能够在运行期改变对象属性的方法,这当然也可以水到渠成了。请看下面的例子。
我们先将上面的“getAge”方法从“Employee”类中注销掉:
class Employee
{
String id
String name
// def getAge()
// {
// 'everyone is 24'
// }
}
然后,我们在运行期来增加“age”属性,如下:
Employee.metaClass."getAge" = {->
"everyone is 24"
}
def empl2 = new Employee(id:'00002',name:'Mike')
println empl2.age
可以看到,我们只要给“Employee”类的“metaClass”对象增加一个“get”方法,就可以为“Employee”类增加一个属性。上面代码的运行结果如下:
everyone is 24
关于“metaClass”对象,在本系列的后面会有更加详细的说明,本节就到此为止。到上面为止,我们已经谈到了给一个类动态的增加属性,想到增加属性,马上有会想到增加方法,在前面的部分,我们已经知道了两个动态增加方法的方法,即“invokeMethod”和“methodMissing”方法。这两个方法的好处是可以批量的增加一个类的方法,而不是像上面动态增加属性那样,一次只能增加一个。
那么,在Groovy语言中,有没有能够批量增加属性的方法呢?我们可以回答,当然有。与增加方法“invokeMethod”对应的增加属性有两个方法,即“getProperty”和“setProperty”。下面我们就来看看它们是如何增加类的属性的。
class Employee
{
String id
String name
def getProperty(String property)
{
"get value from ${property}"
}
}
下面来测试该方法:
def empl3 = new Employee(id:'00003',name:'Rose')
println empl3.name
println empl3.age
运行结果为:
get value from name
get value from age
可以看到,“getProperty”方法分派了所有的“get”方法。上面的例子可能相当的没有实用价值,下面给出一个有一点点实用价值的例子。
比如,我们有一个GroovyBean类,事先我们不能够知道它会有多少个属性,一切在运行期内才有答案。我们就可以做如下的一个GroovyBean类:
class Score {
def private map
def Score()
{
this.map = [:]
}
def getProperty(String property)
{
def value = map."$property"
value = value?value:''
return value
}
void setProperty(String property,Object value)
{
map."$property" = value
}
}
我们来测试上面的例子:
def score = new Score()
score.id = '01'
score.name = 'Chinese'
score.score = '100'
println "$score.name : $score.score"
运行结果为:
Chinese : 100
分享到:
相关推荐
Groovy MOP,全称Meta-Object Protocol(元对象协议),是Groovy语言的一个核心特性,它提供了一种强大的方式来扩展和修改类的行为。在Java中,我们通常需要通过继承或接口实现来扩展功能,但Groovy的MOP允许我们在...
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
MOP允许你在运行时操作和扩展任何对象的行为,而类别增强则允许在已有类上添加方法或属性,这在不修改源码的情况下增强已有库的功能。 最后,学习Groovy的最佳实践,如如何有效地利用元编程,何时使用静态类型以...
Groovy类可以继承Java类,Java方法可以调用Groovy对象,反之亦然。这种互操作性使得在现有Java项目中逐步引入Groovy成为可能,而不必重构整个项目。 五、学习资源 "Groovy的帮助文档"是学习Groovy的重要参考资料,...
在Groovy编程语言中,Map是一种非常重要的数据结构,它用于存储键值对。在本篇博客中,我们将深入探讨Groovy中Map的基本操作,特别是通过标题和描述中给出的例子。 首先,创建一个Map非常简单。例如,`def map = [a...
进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、 Grape依赖管理系统等,提升编程技巧。 七、社区资源与工具 积极参与Groovy社区,利用官方文档、Stack Overflow、Groovy Slack等平台获取...
Groovy提供了丰富的API来操作运行时的对象模型,如使用反射来动态调用方法或获取对象的属性。 #### 七、实用技巧 - **命令行工具**:Groovy提供了一系列命令行工具,如`groovy`命令,用于执行Groovy脚本、评估...
5. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过MetaObjectProtocol (MOP) 实现的。例如,可以动态添加方法、属性,或者改变现有方法的行为。 6. **GDK(Groovy Development Kit)**:GDK是Groovy...
本文将深入探讨如何使用Groovy脚本进行文件操作,包括文件的创建、读取、写入、删除等基本操作,以及更高级的操作,如文件过滤和搜索。通过实际的代码示例,我们将展示Groovy在文件操作中的优雅和力量。 Groovy提供...
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 ) https://hanshuliang.blog.csdn.net/article/details/122815793 博客源码
3. **标准库**:Groovy SDK附带了一套丰富的标准库,包含各种实用的类和函数,如文件操作、网络通信、日期和时间处理等。 4. **GroovyShell**和**GroovyConsole**:这两个工具分别用于交互式地运行Groovy脚本和提供...
通过MOP,开发者可以实现动态方法、属性和操作。 8. **类别(Category)**:类别是一种特殊类型的闭包,可以临时添加到任何类的方法。这对于增加类的功能或实现函数式编程风格非常有用。 9. **GDK(Groovy ...
#### 二、Groovy脚本的特点 1. **与Java的高度兼容性**:Groovy可以无缝地与Java代码集成,可以在Groovy脚本中直接调用Java类库。 2. **动态类型**:Groovy采用了动态类型系统,变量无需显式声明类型。 3. **闭包...
在“groovy脚本实现对数据库的增删改查”这个主题中,我们将深入探讨如何使用Groovy来执行常见的数据库操作。首先,我们需要连接到数据库。在Groovy中,我们可以利用JDBC(Java Database Connectivity)API来实现这...
总的来说,`groovy动态方法`和`MetaClass`、`ExpandoMetaClass`以及MOP是Groovy强大特性的体现,它们为开发者提供了在运行时改变类行为的能力,使得Groovy代码更加灵活多变。掌握这些概念和技巧,将有助于你编写出更...
列表可以通过下标访问,映射则通过键值对操作: ```groovy List list = [1, 2, 3] Map map = [key1: 'value1', key2: 'value2'] println list[0] // 输出:1 println map.key1 // 输出:value1 ``` 4. **...
这篇名为“Groovy动态修改XML”的博文可能详细介绍了如何使用Groovy对XML文档进行动态修改。通常,这个过程包括以下步骤: 1. **解析XML**:首先,使用XMLSlurper或XMLParser将XML字符串或文件转换为Groovy的DOM...
- **元对象协议(MOP)**:Groovy的元对象协议允许在运行时扩展对象的行为。 - **类别(Category)**:类别可以为任何类添加方法,提供一种便捷的扩展机制。 4. **Groovy的脚本支持**: - **脚本执行**:Groovy...
Groovy的列表支持链式操作,如`list.each{println it}`,这会遍历列表并对每个元素执行指定的操作。映射可以通过键值对进行操作,如`map.each{k, v -> println "Key: $k, Value: $v"}`。 Groovy还引入了GString,这...
通过上述步骤,您已经完成了在 Eclipse 中安装 Groovy 插件的过程,并学会了如何使用 Groovy 进行基本的编程操作。Groovy 是一种灵活且功能强大的脚本语言,非常适合用于自动化任务、单元测试以及快速应用开发等领域...