文章目录

  • 一、使用 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 分类进行方法注入的优缺点 )相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  2. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...

  3. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

    文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...

  4. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )

    文章目录 一.方法注入 二.使用 Category 分类注入方法 三.完整代码示例 一.方法注入 在之前的博客中 , 主要是使用 Groovy 元编程 拦截方法 , 改变方法的实现 ; 使用元编程还可 ...

  5. 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

    文章目录 一.动态注入方法 二.完整代码示例 一.动态注入方法 调用 Student 类不存在的方法 , 如果该类重写了 def methodMissing(String name, def args ...

  6. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

    文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...

  7. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )

    文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...

  8. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )

    文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...

  9. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )

    文章目录 一.重写 MetaClass#invokeMethod 方法实现函数拦截 二.在 MetaClass#invokeMethod 方法中调用对象的其它方法 三.完整代码示例 一.重写 Meta ...

最新文章

  1. mysql建立pdm模型_如何使用PowerDesigner创建物理数据模型(PDM)
  2. 13---Net基础加强
  3. 同时删除两张表的数据_把数据表中对应工作表的数据首先删除,然后导入数据...
  4. openresty开发系列27--openresty中封装redis操作
  5. iOS开发学无止境 - 异步图片加载优化与常用开源库分析
  6. [Swift]LeetCode326. 3的幂 | Power of Three
  7. Android Handler.removeCallbacksAndMessages(null)的作用
  8. ajax方式表单拦截
  9. 经典解释监视器和对象锁
  10. Linux技术进阶示意图
  11. WIN10英文版改中文
  12. uni-app uniCloud 开发实践 ,天气预报,小程序,h5,app ,001章
  13. 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
  14. C++:tuple的解包tie【tuple<std::string, int, int> tp;tie(name, ages, areaCode) = tp】
  15. 学习计算机的英语口语,最实用的英语口语学习技巧
  16. JQuery 查询文档元素
  17. 卢沟桥对于古代北京的作用
  18. 智能音箱 之 扬声器喇叭介绍
  19. 2020年中国地理信息产业现状分析,发展前景广阔「图」
  20. qq幻想水母球前缀属性对比

热门文章

  1. Activt工作流数据库对应表的作用
  2. srping atomikos 的jta 事物管理
  3. XML与DataSet的相互转换
  4. 如何让你的SQL运行得更快
  5. bzoj 1058: [ZJOI2007]报表统计 (Treap)
  6. 笔试题118-130
  7. SpringMVC:学习笔记(4)——处理模型数据
  8. 使用markdown编辑evernote(印象笔记)的常用方法汇总
  9. 第三次冲刺12.16
  10. Tomcat绿色版启动startup.bat一闪问题的解决方法!