前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Category 注解进行方法注入 | 分类注入方法查找优先级 )

【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Category 注解进行方法注入 | 分类注入方法查找优先级 )

作者头像
韩曙亮
发布2023-03-30 10:40:44
1370
发布2023-03-30 10:40:44
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、使用 @Category 注解进行方法注入


@Category 注解原型如下 :

代码语言:javascript
复制
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
@GroovyASTTransformationClass({"org.codehaus.groovy.transform.CategoryASTTransformation"})
public @interface Category {
    Class value() default Object.class;
}

@Category 注解使用方法 : 声明注解时 , 传入 Class 类型 参数 , 表示这是要为哪个类注入方法 ;

代码语言:javascript
复制
@Category(Student.class)
class Hello2 {
    def hello() {
        System.out.println "Hello"
    }
}

二、分类注入方法查找优先级


使用多个分类进行方法注入时 , 如果方法分类中定义了相同的方法 , 则优先从左到右进行查找 , 下图示例中 , 先后声明了 Hello , Hello2 两个分类 , 在 use 代码块中调用了 hello 方法 , 那么按照倒序开始在分类列表中查找 hello 方法 , 如果在 Hello2 中查找到了 hello 方法 , 则使用该方法 ;

即使在 Hello 分类中定义了 hello 方法 , 也会被屏蔽 ;

如果类中已经存在了要注入的方法 , 但是分类中又注入了该方法 , 则优先使用分类中的方法 , 类自带的方法被屏蔽 ;

声明分类 Hello , Hello2 时 , 优先调用 Hello2 中的方法 ;

声明分类 Hello2 , Hello 时 , 优先调用 Hello 中的方法 ;

三、完整代码示例


完整代码示例 :

代码语言:javascript
复制
class Student {
    def name;
}

class Hello {
    static def hello(Student self) {
        System.out.println "Hello ${self.name}"
    }
}

@Category(Student.class)
class Hello2 {
    def hello() {
        System.out.println "Hello"
    }
}

// use 代码块可以同时使用多个注入方法分类
use(Hello, Hello2) {
    new Student(name: "Tom").hello()
}

执行结果 :

代码语言:javascript
复制
Hello
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、使用 @Category 注解进行方法注入
  • 二、分类注入方法查找优先级
  • 三、完整代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档