Java 11, зачем нам аннотация на лямбда-параметр? - PullRequest
0 голосов
/ 15 ноября 2018

Как вы знаете, в Java 11 добавлена ​​возможность использовать var в параметрах лямбды, чтобы вы могли добавить аннотацию, но здесь я попытался получить ее во время выполнения, но поскольку лямбда неполноценного класса с его методом, его там нет.

Следует отметить, что он хорошо работает с анонимным классом.

С анонимным классом - вывод:

[[@test.MyAnnotation()]]
public class Main {

    public static void main(String[] args) throws NoSuchMethodException {
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @Override
            public void accept(@MyAnnotation Integer integer) {
                System.out.println(integer + 1);
            }
        };

        foo(consumer);
    }

    public static void foo(Consumer<Integer> consumer) throws NoSuchMethodException {
        Method method = consumer.getClass().getMethod("accept", Object.class);
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        System.out.println(Arrays.deepToString(parameterAnnotations));
    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {

}

С лямбдой - Вывод:

 [[]]
public class Main {

    public static void main(String[] args) throws NoSuchMethodException {
        Consumer<Integer> consumer = (@MyAnnotation var integer) -> System.out.println(integer + 1);

        foo(consumer);
    }

    public static void foo(Consumer<Integer> consumer) throws NoSuchMethodException {
        Method method = consumer.getClass().getMethod("accept", Object.class);
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        System.out.println(Arrays.deepToString(parameterAnnotations));
    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {

}

У вас есть какое-нибудь объяснение?

1 Ответ

0 голосов
/ 15 ноября 2018

Аннотации могут использоваться в исходном коде для предоставления дополнительной информации, а также с обработкой аннотаций.

Я не уверен, полезно ли это во время выполнения. Дамп байт-кода указывает на то, что аннотация не записана.

  // access flags 0x9
  public static main([Ljava/lang/String;)V throws java/lang/NoSuchMethodException 
    // parameter  args
   L0
    LINENUMBER 11 L0
    INVOKEDYNAMIC accept()Ljava/util/function/Consumer; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
      // arguments:
      (Ljava/lang/Object;)V, 
      // handle kind 0x6 : INVOKESTATIC
      Main.lambda$main$0(Ljava/lang/Integer;)V, 
      (Ljava/lang/Integer;)V
    ]
    ASTORE 1
   L1
    LINENUMBER 13 L1
    ALOAD 1
    INVOKESTATIC Main.foo (Ljava/util/function/Consumer;)V
   L2
    LINENUMBER 14 L2
    RETURN
   L3
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
    LOCALVARIABLE consumer Ljava/util/function/Consumer; L1 L3 1
    // signature Ljava/util/function/Consumer<Ljava/lang/Integer;>;
    // declaration: java.util.function.Consumer<java.lang.Integer>
    MAXSTACK = 1
    MAXLOCALS = 2

Если я запускаю следующее, он ничего не получает.

 strings Main.class | grep MyAnn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...