- 定义一个注解MyTest,要求只能定义在方法上,注解可以在运行时起作用 - 凡是被MyTest注解标记的方法,都可以自动执行 - MyTest注解有order属性,默认值是1。可以赋值整数数字,order值大的方法先执行
时间: 2024-05-10 10:14:39 浏览: 74
可以这样定义MyTest注解:
```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {
int order() default 1;
}
```
- `@Retention(RetentionPolicy.RUNTIME)` 表示 MyTest 注解在运行时保留,可以通过反射获取;
- `@Target(ElementType.METHOD)` 表示 MyTest 注解只能定义在方法上;
- `int order() default 1;` 表示 MyTest 注解有一个 order 属性,默认值为 1。
接下来,我们可以定义一个测试类,使用 MyTest 注解:
```java
public class MyTestDemo {
@MyTest(order = 2)
public void test1() {
System.out.println("test1");
}
@MyTest(order = 1)
public void test2() {
System.out.println("test2");
}
@MyTest
public void test3() {
System.out.println("test3");
}
public static void main(String[] args) throws Exception {
// 获取 MyTestDemo 类中所有方法
Method[] methods = MyTestDemo.class.getDeclaredMethods();
// 定义一个 Map 用于存放 MyTest 注解的方法
Map<Integer, List<Method>> map = new TreeMap<>((o1, o2) -> o2 - o1);
for (Method method : methods) {
// 判断方法是否被 MyTest 注解标记
if (method.isAnnotationPresent(MyTest.class)) {
// 获取 MyTest 注解
MyTest myTest = method.getAnnotation(MyTest.class);
// 获取 order 值
int order = myTest.order();
// 判断 map 中是否已经存在 order 值对应的 List
if (!map.containsKey(order)) {
map.put(order, new ArrayList<>());
}
// 将方法添加到 List 中
map.get(order).add(method);
}
}
// 循环执行方法
for (Map.Entry<Integer, List<Method>> entry : map.entrySet()) {
for (Method method : entry.getValue()) {
// 执行方法
method.invoke(new MyTestDemo());
}
}
}
}
```
MyTestDemo 类中定义了三个方法 test1、test2 和 test3,并且都被 MyTest 注解标记,其中 test1 和 test2 的 order 值分别为 2 和 1,test3 没有指定 order 值,默认为 1。在 main 方法中,我们使用反射获取 MyTestDemo 类中所有方法,然后通过 TreeMap 来按照 order 值排序,最后循环执行方法。执行结果如下:
```
test1
test2
test3
```
可以看到,先执行了 order 值为 2 的 test1 方法,然后执行了 order 值为 1 的 test2 和 test3 方法。
阅读全文