getDeclaredMethods () + создание массива = дополнительный метод? - PullRequest
0 голосов
/ 15 октября 2019

Я работаю с отражением и заметил неожиданные методы. Я полностью сузил его до нескольких строк кода, которые воспроизводят проблему:

import java.lang.reflect.Method;
import java.util.Arrays;

class Scratch {
    void someMethod() {
        // Yea yea, useless code but it's just for demonstration!
        Arrays.stream(new Integer[] { 0 }).toArray(Integer[]::new);
    }

    public static void main(String[] args) {
        for (Method method: Scratch.class.getDeclaredMethods()) {
            System.out.println(method);   
        }
    }
}

Я прошу JVM предоставить мне все объявленные методы . Я ожидаю увидеть 2 метода: main и someMethod(). Но я вижу другой:

private static java.lang.Integer[] Scratch.lambda$someMethod$0(int)

Если я уберу одну-единственную строку внутри someMethod, я получу только 2 метода в результате вызова getDeclaredMethods, как и следовало ожидать.

Что это за метод ламбы? Я не могу вызвать его напрямую на Scratch, статический метод недоступен (Integer[] result = Scratch.lambda$someMethod$0(0);). Это какой-то частный метод? Документы по getDeclaredMethods() ничего не говорят об этом поведении.

Я компилирую с Java 8.

1 Ответ

2 голосов
/ 15 октября 2019

Посмотрите на сигнатуру метода stream.toArray:

toArray(IntFunction<A> generator)

Scratch.lambda $ someMethod $ 0 (int) - это просто лямбда-выражение, которое вы передаете в качестве аргумента методу stream.toArray.

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