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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 @Category 注解进行方法注入 | 分类注入方法查找优先级 )相关的知识,希望对你有一定的参考价值。

文章目录





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



@Category 注解原型如下 :

@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
@GroovyASTTransformationClass("org.codehaus.groovy.transform.CategoryASTTransformation")
public @interface Category 
    Class value() default Object.class;

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

@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 中的方法 ;





三、完整代码示例



完整代码示例 :

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()

执行结果 :

Hello

以上是关于GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 @Category 注解进行方法注入 | 分类注入方法查找优先级 )的主要内容,如果未能解决你的问题,请参考以下文章

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )

GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )

GroovyMOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )