【问题标题】:getDeclaredMethods() + creating array = extra method?getDeclaredMethods() + 创建数组 = 额外方法?
【发布时间】:2019-10-15 23:44:40
【问题描述】:

我正在使用反射,我注意到了意想不到的方法。我将其完全缩小到重现问题的这几行代码:

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 给我所有的 declared methods。我希望看到 2 种方法:mainsomeMethod()。但我看到另一个:

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

如果我删除 someMethod 中唯一的一行,我会因为调用 getDeclaredMethods 而得到 2 个方法,正如我所期望的那样。

这个lamba方法是什么?我不能直接在Scratch 上调用它,静态方法不可用(Integer[] result = Scratch.lambda$someMethod$0(0);)。它是某种私有方法吗? getDeclaredMethods() 上的文档没有说明这种行为。

我正在使用 Java 8 进行编译。

【问题讨论】:

标签: java reflection


【解决方案1】:

查看stream.toArray方法的签名:

toArray(IntFunction<A> generator)

Scratch.lambda$someMethod$0(int) 只是您作为参数传递给 stream.toArray 方法的 lambda 表达式。

【讨论】:

  • 如果方法引用(转换为 lambda)生成 private static 方法,那么为什么下面的代码:Arrays.stream(Main.class.getDeclaredMethods()).forEach(System.out::println); 不会为 System.out::println 生成一个?毕竟,它实际上是一个调用System.out.println 的lambda。与有效调用 new Integer[] 的 lambda 有什么不同?
  • 在此示例中,您在将 lambda 的评估传递到 foreach 之前调用 getDeclaredMethods()。您是否尝试用 foreach 替换您的 toArray(Integer[]::new) (使用虚拟 lambda,只是为了尝试 getDeclaredMethods 是否会显示它)?
  • 我不是 OP,但System.out::println 的位置没有任何改变。简单的方法引用并不总是产生生成的函数。我会尝试检查并给出答案,但您的答案并不涵盖所有情况。
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 2014-01-28
  • 2011-01-23
  • 2021-12-10
  • 1970-01-01
  • 2015-02-15
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多