【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
文章目录
- 一、使用 Category 分类进行方法注入的优点
- 二、使用 Category 分类进行方法注入的缺点
一、使用 Category 分类进行方法注入的优点
之前的博客
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Category 注解进行方法注入 | 分类注入方法查找优先级 )
中使用 Category 进行方法注入 , 其优点是 使用方式灵活 , 可控性高 ;
- 使用灵活 : 可以在任意位置使用 use 代码块 , 使用不同的注入方法分类 ;
- 可控性高 : 只能在 use 代码块中使用 , 在其它地方不能使用注入的方法 ;
二、使用 Category 分类进行方法注入的缺点
影响性能 : 调用 use 方法 , 其内部执行了一系列的方法注入操作 , 对性能有一定的影响 ;
调用 use 方法 , 进行了一系列的调用 ;
先调用了 DefaultGroovyMethods#use 方法 ,
public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {public static Object use(Object self, Object[] array) {if (array.length < 2) {throw new IllegalArgumentException("Expecting at least 2 arguments, a category class and a Closure");} else {Closure closure;try {closure = (Closure)array[array.length - 1];} catch (ClassCastException var8) {throw new IllegalArgumentException("Expecting a Closure to be the last argument");}List<Class> list = new ArrayList(array.length - 1);for(int i = 0; i < array.length - 1; ++i) {Class categoryClass;try {categoryClass = (Class)array[i];} catch (ClassCastException var7) {throw new IllegalArgumentException("Expecting a Category Class for argument " + i);}list.add(categoryClass);}return GroovyCategorySupport.use(list, closure);}}
}
然后又调用了 GroovyCategorySupport#use 方法 ,
public class GroovyCategorySupport {public static <T> T use(List<Class> categoryClasses, Closure<T> closure) {return THREAD_INFO.getInfo().use(categoryClasses, closure);}
}
最后调用了 GroovyCategorySupport#ThreadCategoryInfo#use 方法 ;
public class GroovyCategorySupport {public static class ThreadCategoryInfo extends HashMap<String, GroovyCategorySupport.CategoryMethodList> {public <T> T use(List<Class> categoryClasses, Closure<T> closure) {this.newScope();try {Iterator i$ = categoryClasses.iterator();while(i$.hasNext()) {Class categoryClass = (Class)i$.next();this.use(categoryClass);}Object var8 = closure.call();return var8;} finally {this.endScope();}}}
}
上述调用操作肯定会影响方法执行的效率 ;
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )相关推荐
- 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
文章目录 一.方法注入 二.使用 Category 分类注入方法 三.完整代码示例 一.方法注入 在之前的博客中 , 主要是使用 Groovy 元编程 拦截方法 , 改变方法的实现 ; 使用元编程还可 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
文章目录 一.动态注入方法 二.完整代码示例 一.动态注入方法 调用 Student 类不存在的方法 , 如果该类重写了 def methodMissing(String name, def args ...
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
文章目录 一.重写 MetaClass#invokeMethod 方法实现函数拦截 二.在 MetaClass#invokeMethod 方法中调用对象的其它方法 三.完整代码示例 一.重写 Meta ...
最新文章
- mysql建立pdm模型_如何使用PowerDesigner创建物理数据模型(PDM)
- 13---Net基础加强
- 同时删除两张表的数据_把数据表中对应工作表的数据首先删除,然后导入数据...
- openresty开发系列27--openresty中封装redis操作
- iOS开发学无止境 - 异步图片加载优化与常用开源库分析
- [Swift]LeetCode326. 3的幂 | Power of Three
- Android Handler.removeCallbacksAndMessages(null)的作用
- ajax方式表单拦截
- 经典解释监视器和对象锁
- Linux技术进阶示意图
- WIN10英文版改中文
- uni-app uniCloud 开发实践 ,天气预报,小程序,h5,app ,001章
- 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
- C++:tuple的解包tie【tuple<std::string, int, int> tp;tie(name, ages, areaCode) = tp】
- 学习计算机的英语口语,最实用的英语口语学习技巧
- JQuery 查询文档元素
- 卢沟桥对于古代北京的作用
- 智能音箱 之 扬声器喇叭介绍
- 2020年中国地理信息产业现状分析,发展前景广阔「图」
- qq幻想水母球前缀属性对比