文章目录
- 一、使用 @Category 注解进行方法注入
- 二、分类注入方法查找优先级
- 三、完整代码示例
一、使用 @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