【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )
2023-06-13 09:18:00 时间
文章目录
一、分析使用 MetaClass 进行方法注入前后 mateClass 类型变化
打印下面 Student 类 的 metaClass ,
class Student {
def name;
}
println Student.metaClass
打印结果如下 :
org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]]
使用 metaClass 向 Student类中 , 注入了多个方法 ,
// 注入多个类型的方法
Student.metaClass {
// 注入普通方法
hello = {
println "Hello ${delegate.name}"
}
// 注入普通方法
say = {
println "My name is ${delegate.name}"
}
// 注入静态方法
'static' {
fun = {
println "Class Type : ${delegate}"
}
}
// 注入构造方法
constructor = {
String str ->
new Student(name: str)
}
}
注入之后 , 再次使用 println Student.metaClass
打印 Student.metaClass 内容 , 打印结果变成了
groovy.lang.ExpandoMetaClass@41e36e46[class Student]
方法注入前 , 类的 metaClass 类型为 org.codehaus.groovy.runtime.HandleMetaClass , 方法注入后 , 类的 metaClass 的类型变为了 groovy.lang.ExpandoMetaClass ;
使用 MetaClass 进行方法注入 , 是通过将 metaClass 替换为 groovy.lang.ExpandoMetaClass 对象实现的 ;
二、完整代码示例
完整代码示例 :
class Student {
def name;
}
println Student.metaClass
// 注入多个类型的方法
Student.metaClass {
// 注入普通方法
hello = {
println "Hello ${delegate.name}"
}
// 注入普通方法
say = {
println "My name is ${delegate.name}"
}
// 注入静态方法
'static' {
fun = {
println "Class Type : ${delegate}"
}
}
// 注入构造方法
constructor = {
String str ->
new Student(name: str)
}
}
println Student.metaClass
// 调用注入的静态方法
Student.fun()
// 使用注入的构造方法初始化 Student 类
def student = new Student("Tom")
// 调用注入的普通方法
student.hello()
student.say()
执行结果 :
org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]]
groovy.lang.ExpandoMetaClass@7c0c77c7[class Student]
Class Type : class Student
Hello Tom
My name is Tom
相关文章
- 一种Linux下ptrace隐藏注入shellcode技术和防御方法
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
- 【错误记录】Groovy 注入方法报错 ( Cannot add new method [hello] for arguments [[]]. It already exists )
- 防御SQL注入的方法总结
- oracle数据库CPU特别高的解决方法详解数据库
- MySQL防止SQL注入的过滤方法(mysql过滤注入)
- 修改MySQL表中数据的方法(mysql修改表的数据)
- 文件使用Linux 生成 .o文件的实现方法(linux生成.o)
- 预防Oracle SQL注入:一种简单易行的方法(oraclesql注入)
- MySQL注入:一种绕开安全防护的方法。(mysql注入绕过)
- T-SQL篇如何防止SQL注入的解决方法
- MySQL中防御SQL注入攻击的方法(mysql中sql注入)
- 高级php注入方法集锦
- MySQL查询结果取交集的实现方法
- php中防止SQL注入的最佳解决方法
- php使用execshell命令注入的方法讲解
- Node.js中安全调用系统命令的方法(避免注入安全漏洞)
- PHP登录环节防止sql注入的方法浅析