在Java开发中,我们有时需要控制某些方法的执行顺序,特别是在初始化、测试或特定业务逻辑场景下。本文将介绍如何通过自定义注解来实现方法的排序执行。
1、定义注解
创建一个自定义注解@ExecuteOrder来标记方法的执行顺序。
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 ExecuteOrder {
int value() default 0;
}
2、使用注解标记方法
public class Processor {
@ExecuteOrder(1)
public void step1() {
System.out.println("执行 step1");
}
@ExecuteOrder(3)
public void step2() {
System.out.println("执行 step2");
}
@ExecuteOrder(2)
public void step3() {
System.out.println("执行 step3");
}
// 没有注解的方法不会被执行
public void utilityMethod() {
System.out.println("工具方法");
}
}
3、实现注解处理器
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class AnnotationProcessor {
public static void process(Object instance) {
// 获取所有方法
Method[] methods = instance.getClass().getDeclaredMethods();
// 过滤并排序带有@ExecuteOrder注解的方法
List<Method> orderedMethods = Arrays.stream(methods)
.filter(m -> m.isAnnotationPresent(ExecuteOrder.class))
.sorted(Comparator.comparingInt(m -> m.getAnnotation(ExecuteOrder.class).value()))
.toList();
// 按顺序执行方法
for (Method method : orderedMethods) {
try {
method.invoke(instance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
4、使用示例
public class Main {
public static void main(String[] args) {
Processor processor = new Processor();
AnnotationProcessor.process(processor);
}
}
输出结果:
执行 step1
执行 step3
执行 step2