MST

星途 面试题库

面试题:Java自定义注解与元注解的结合应用

创建一个自定义注解,要求使用元注解来限制该注解只能用于方法上,并且可以指定方法的执行优先级。然后编写一个示例代码,展示如何在方法上使用这个注解,并在运行时根据优先级顺序调用这些方法。
39.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 定义自定义注解
    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;
    }
    
  2. 示例类及方法
    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方法中,通过反射获取带有该注解的方法,并根据优先级对方法进行排序,最后按照优先级顺序调用这些方法。