概述
groovy作为一门动态语言,使用非常灵活。MOP中提供了动态类与运行时的方法注入,整理了一下使用方法。
一、动态类
def expando =new Expando(name:"hello",fun1:{println "fun1"})
println expando.name
//这里这样使用依然会报错,相信也是只生成了方法
//println expando.@name
expando.fun1()
expando.age=14
println expando.age
expando.fun2={
println "fun2"
}
expando.fun2()
结果:
hello
fun1
14
fun2
二、方法注入
方法注入在groovy中有三种形式。
- 1、metaclass
- 2、category
- 3、 mixin
分别看一下使用方法
(一) metaClass
对于metaClass其实上一篇文章有过简单的使用。其实使用非常简单。
添加静态方法与普通方法
String.metaClass.printSelf={
//delegate是实例
println delegate
}
"123".printSelf()
String.metaClass.'static'.testHello={
println 'hello'
}
String.testHello()
class ABC{
int i=5
}
String.metaClass.constructor={
ABC it->
new String("$it.i")
}
println new String(new ABC())
结果:
123
hello
5
多个方法一并注入
String.metaClass{
printSelf = {
//delegate是实例
println delegate
}
'static' {
testHello = {
println 'hello'
}
}
constructor = {
ABC a ->
new String("$a.i")
}
}
String.testHello()
结果就不多做演示了,基本和上面的类似。
关于metaClass其实还有其他细节,这篇文章的metaClass总结的十分详细,可以直接看一看。
https://blog.csdn.net/qjbagu/article/details/49735255
(二) 使用分类进行注入
这种方式需要使用use进行,直接写类名和类名.class是一样的。
class ExMethod{
static def log(String self) {
println self
}
}
use(ExMethod){
"123".log()
}
@Category(String)
class ExMethod1{
def log() {
println this
}
}
use(ExMethod1){
"256".log()
}
结果:
123
256
(三)使用mixin进行注入
class Get{
def get(String url){
url.toURL().text;
}
}
String.mixin(Get)
println "".get("http://www.baidu.com")
结果:
<!DOCTYPE html>.....
使用mixin注解
class Helper {
def work() {
println "$name is working"
}
}
@Mixin(Helper)
class AGroovyClass {
def getName() { "AGroovyClass" }
}
new AGroovyClass().work() // AGroovyClass is working
结果:
AGroovyClass is working
方法注入基本上已经写完了,接下来是方法合成以及委托。
最后
以上就是彪壮期待为你收集整理的Groovy语法学习(八)MOP探索之动态类与方法注入的全部内容,希望文章能够帮你解决Groovy语法学习(八)MOP探索之动态类与方法注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复