面试题答案
一键面试- 定义自定义注解:
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 MethodPriority { int value() default 0; }
- 示例类及方法:
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class PriorityDemo { @MethodPriority(3) public void methodWithPriority3() { System.out.println("Method with priority 3"); } @MethodPriority(1) public void methodWithPriority1() { System.out.println("Method with priority 1"); } @MethodPriority(2) public void methodWithPriority2() { System.out.println("Method with priority 2"); } public static void main(String[] args) throws Exception { PriorityDemo demo = new PriorityDemo(); List<Method> methods = new ArrayList<>(); for (Method method : demo.getClass().getMethods()) { if (method.isAnnotationPresent(MethodPriority.class)) { methods.add(method); } } Collections.sort(methods, new Comparator<Method>() { @Override public int compare(Method m1, Method m2) { MethodPriority p1 = m1.getAnnotation(MethodPriority.class); MethodPriority p2 = m2.getAnnotation(MethodPriority.class); return p1.value() - p2.value(); } }); for (Method method : methods) { method.invoke(demo); } } }
在上述代码中:
- 首先使用
@Retention(RetentionPolicy.RUNTIME)
元注解确保注解在运行时可用,@Target(ElementType.METHOD)
元注解确保注解只能用于方法上。MethodPriority
注解有一个value
属性用于指定方法的执行优先级。 - 在
PriorityDemo
类中,定义了三个带有MethodPriority
注解的方法。在main
方法中,通过反射获取带有该注解的方法,并根据优先级对方法进行排序,最后按照优先级顺序调用这些方法。