【问题标题】:Java - How to get multiple annotations in a single parameter?Java - 如何在单个参数中获取多个注释?
【发布时间】:2020-03-02 01:42:20
【问题描述】:

如果我有这样的方法:

   testLink(@LinkLength(min=0, max=5) List<@LinkRange(min=5, max=9) Integer> link) { ... }

如何同时获得@LinkLength 和@LinkRange 注释?

【问题讨论】:

    标签: java annotations


    【解决方案1】:

    我假设您想以反思的方式访问这些注释。这是一个例子:

    package com.example;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.lang.reflect.AnnotatedParameterizedType;
    import java.lang.reflect.AnnotatedType;
    import java.lang.reflect.Method;
    import java.lang.reflect.Parameter;
    import java.util.List;
    
    public class Main {
    
      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.PARAMETER, ElementType.TYPE_USE})
      public @interface Foo {
    
        String value();
      }
    
      public static void bar(@Foo("parameter") List<@Foo("type_use") Integer> list) {}
    
      public static void main(String[] args) throws NoSuchMethodException {
        Method method = Main.class.getMethod("bar", List.class);
    
        // get annotation from parameter
        Parameter parameter = method.getParameters()[0];
        System.out.println("PARAMETER ANNOTATION = " + parameter.getAnnotation(Foo.class));
    
        // get annotation from type argument used in parameter
        AnnotatedParameterizedType annotatedType =
            (AnnotatedParameterizedType) parameter.getAnnotatedType();
        AnnotatedType typeArgument = annotatedType.getAnnotatedActualTypeArguments()[0];
        System.out.println("TYPE_USE ANNOTATION  = " + typeArgument.getAnnotation(Foo.class));
      }
    }
    

    输出如下:

    PARAMETER ANNOTATION = @com.example.Main$Foo(value="parameter")
    TYPE_USE ANNOTATION  = @com.example.Main$Foo(value="type_use")
    

    以下是使用的方法:

    上面的例子充分利用了bar 方法的知识。换句话说,我知道有一个参数,我知道Parameter#getAnnotatedType() 会返回AnnotatedParameterizedType,我知道参数化类型有一个类型参数。在反射式扫描任意类时,不会提前知道此信息,这意味着您必须添加适当的检查并仅在适当时执行某些操作。例如:

    AnnotatedType type = parameter.getAnnotatedType();
    if (type instanceof AnnotatedParameterizedType) {
      // do something...
    }
    

    【讨论】:

    • 酷。我不知道 TYPE_USE。
    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多