Я работаю с отражением и заметил неожиданные методы. Я полностью сузил его до нескольких строк кода, которые воспроизводят проблему:
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.
private static
, то почему следующий код:Arrays.stream(Main.class.getDeclaredMethods()).forEach(System.out::println);
не генерирует метод дляSystem.out::println
? В конце концов, это фактически лямбда, которая вызываетSystem.out.println
. Что там такого отличного от лямбды, которая эффективно вызываетnew Integer[]
? 15.10.2019System.out::println
ничего не меняет. Простая ссылка на метод не всегда приводит к сгенерированной функции. Я постараюсь изучить его и дать ответ, но ваш не охватывает все случаи. 16.10.2019