Groovy探索之MOP 十五 方法名的动态性(1)
到目前为止,我们的《Groovy探索之MOP》系列已经谈到了使用ExpandoMetaClass的方方面面,但值得注意的是,我们通过ExpandoMetaClass给一个类在运行期内添加一个方法,不管是普通方法还是静态方法,我们都是添加一个确定方法名的方法。即我们添加一个方法名为A的方法,然后才能使用这个方法A。
然而,方法名的动态性,其实是我们早已接触过的事情,比如在《Groovy探索之invokeMethod方法》里,我们就可以创建形如“sortByXxxxx()”这样漂亮的方法。当然了,在那篇文字里,我们是通过“invokeMethod”方法来实现的。
我们都知道,使用ExpandoMetaClass在运行期内给一个对象或类添加一个方法要比hook方法简单得多,所以,我们在实际的编码过程中,更多时候会用到ExpandoMetaClass来实现。那么,我们使用ExpandoMetaClass是否也可以实现上面hook方法所实现了的方法名的动态性呢?
我们知道,使用ExpandoMetaClass在运行期内添加一个方法(不管是给对象还是给类),形式都是像下面的样子:
类名.metaClass.方法名 = 方法体
同时,上面的公式还可以写成如下的样子:
类名.metaClass. "方法名" = 方法体
这下我们明白了,既然方法名可以用双引号括起来,那么,如果双引号里面是一个Gstring对象的话,这样,我们就可以给方法赋予一个可变的数据了。从而达到了我们使用ExpandoMetaClass实现方法名的动态性的目的了。
废话少说,我们还是先来看一个例子吧!
现在,我们有一个T类,如下:
class T
{
}
我们就可以这样对T类添加方法:
String functionName = "a";
T.metaClass."$functionName" = {
println "invoke $functionName"
}
def t = new T()
t.a()
我们在添加方法的时候,使用了一个Gstring对象来代替了写死的字符串,这样就实现了方法名的动态性。运行结果为:
invoke a
当然了,你可能会觉得上面的方法名的动态性还不够清晰,那么,我们可以实现如下的一个静态方法,来达到我们方法名动态性的目的:
def static add(functionName)
{
T.metaClass."$functionName" = {
println "invoke $functionName"
}
}
这样,我们就可以如下来使用它了:
add('b')
def t1 = new T()
t1.b()
add('c')
def t2 = new T()
t2.c()
运行结果为:
invoke b
invoke c
上面的例子只是小儿科,我们使用ExpandoMetaClass实现的方法名的动态性同样可以使用于《Groovy探索之invokeMethod方法》中的那个有名的例子。关于那个例子的来历,大家可以在原文中看到,这里就不再重述。
在那篇文字中,Student类是这样的:
class Student {
String no;
String name;
float chinScore;
float mathScore;
float englScore;
float physScore;
float chemScore;
float totalScore;
}
同样,我们的那个排序工具类还是保留,只是不再实现它的排序方法了,如下:
class SortHelper
{
def list
public SortHelper(list)
{
this.list = list
}
}
当然,我们的排序方法是要留给ExpandoMetaClass来实现的,下面就是:
['chinScore','mathScore','englScore','physScore','chemScore','totalScore'].each{
name ->
def name1 = name[0].toUpperCase()+name[1..-1]
SortHelper.metaClass."sortBy${name1}" = {
->
def comparator = {
node1,node2 ->
return node1."${name}".compareTo(node2."${name}")
} as Comparator
Collections.sort(delegate.list,comparator)
}
}
我们的想法就是,把要实现的方法的方法名(或部分)组成一个数组,然后依次遍历,交给ExpandoMetaClass来添加方法。
上面的代码都很简单,在这里我们就不再多说了。
最后,我们来写代码测试上面的添加方法了。如下:
分享到:
相关推荐
7. **代码热更新和热插拔**: 由于Groovy MOP的动态性,你可以在应用运行时修改类的行为,而无需重启应用。这对于快速迭代和调试非常有用,特别是在Grails这样的Web框架中,可以实现热更新控制器和服务类的代码。 在...
MOP使得Groovy具备了强大的灵活性和动态性,能够轻松实现一些在静态类型语言中难以实现的功能。 Groovy的动态方法和元编程对于开发工具、插件、脚本等场景尤其有用,可以极大地提高开发效率和代码的可扩展性。例如...
对于初学者,理解Groovy的Meta-Object Protocol (MOP) 和Groovy的类别增强机制也至关重要。MOP允许你在运行时操作和扩展任何对象的行为,而类别增强则允许在已有类上添加方法或属性,这在不修改源码的情况下增强已有...
总之,Groovy 1.5.5 API文档是开发者理解并有效使用Groovy语言的重要资源,它涵盖了语言的基本概念、核心类库、动态性以及与其他Java技术的交互。通过深入学习这个API,开发者能够充分利用Groovy的灵活性和生产力...
进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、 Grape依赖管理系统等,提升编程技巧。 七、社区资源与工具 积极参与Groovy社区,利用官方文档、Stack Overflow、Groovy Slack等平台获取...
5. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过MetaObjectProtocol (MOP) 实现的。例如,可以动态添加方法、属性,或者改变现有方法的行为。 6. **GDK(Groovy Development Kit)**:GDK是Groovy...
- **元对象协议(MOP)**:Groovy的元对象协议允许在运行时扩展对象的行为。 - **类别(Category)**:类别可以为任何类添加方法,提供一种便捷的扩展机制。 4. **Groovy的脚本支持**: - **脚本执行**:Groovy...
2. **动态性**:Groovy支持动态类型,允许在运行时更改对象行为。 3. **兼容性**:可以直接使用Java库和API,无需任何额外的桥接或适配器。 4. **灵活性**:在需要的地方引入Groovy,可以利用其脚本语言的灵活性,而...
- **动态性**:Groovy支持动态类型系统,可以在运行时改变变量的类型。 - **简洁性**:Groovy简化了许多Java中的冗余语法,如无需显式声明变量类型。 - **扩展性**:Groovy允许开发者通过元编程来扩展现有类的...
4. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过元对象协议(Meta Object Protocol, MOP)实现的。元编程为动态扩展和定制对象提供了可能。 5. **GString**:Groovy的GString可以方便地进行字符串...
`ExpandoMetaClass`允许动态添加方法到类,`MetaObjectProtocol (MOP)`则提供了访问和改变对象行为的机制。 7. **AST转换**:Groovy的抽象语法树(AST)转换允许开发者在编译时修改源代码,实现自定义的编程特性。 8...
3. **元对象协议(MOP)**:Groovy的元对象协议允许在运行时修改类的行为,提供了强大的元编程能力。你可以添加方法、属性,甚至改变现有类的行为。 4. **GString**:Groovy的GString可以方便地进行字符串插值,类似...
这一部分会涵盖MetaObjectProtocol (MOP) 和类别(Category)的概念,以及动态方法添加、属性注入等技巧。 4. **Grails框架**:Groovy与Web开发紧密相连,Grails是一个基于Groovy的全栈式开发框架,它简化了Spring...
受Smalltalk和Lisp启发,Groovy引入了Meta-Object Protocol(MOP),允许在运行时拦截方法调用和属性访问。通过元类,我们可以为现有的类添加新的行为。例如,下面的代码展示了如何使用Expando-MOP为Integer类添加`...
此外,Groovy还支持元对象协议(MOP),允许开发者对对象的行为进行定制化扩展,从而实现了更为灵活的对象交互方式。 ##### 轻松的脚本语法 Groovy提供了可选的分号、括号以及类声明(对于脚本而言),这让脚本编写...
4. **元编程**:理解Groovy如何通过元对象协议(Meta Object Protocol, MOP)提供元编程能力,允许在运行时动态修改类和对象的行为。 5. **Grails框架**:如果时间允许,可以扩展到Groovy在Web开发中的应用,如...
在开发Groovy插件时,还需要关注Groovy语言的特性,如闭包、动态类型、元对象协议(MOP)等,以及如何与Eclipse的Java开发工具(JDT)集成。例如,你可以利用Groovy的AST(抽象语法树)转换来增强代码的自动完成和...