Я работаю с отражением и заметил неожиданные методы. Я полностью сузил его до нескольких строк кода, которые воспроизводят проблему:
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.