在Java方法中引用reflectionAPI的一部分

在Kotlin中,方法引用的结果放在包kotlin.reflect中。 Java中的方法引用也是reflection-api的一部分吗?

实现方法引用的function接口的实际types是故意不指定的。 重要的是,它是由当前的JRE提供的。

实际上,就HotSpot / OpenJDK而言,它是一个运行时生成的类,与包含方法引用的类位于相同的包和类加载上下文中。 它不从一个特殊的类inheritance,除了由其目标types定义的接口之外,不实现其他接口。 所以虽然这个类有一些特殊的属性,也就是说它不能被名字查找,它可能会收集垃圾,无论其定义类加载器的可达性,但它不是reflectionAPI的一部分。

为方法引用创建的实例的属性由Java Language Specification指定如下:

方法引用expression式的值是对具有以下属性的类的实例的引用:

  • 该类实现目标函数接口types,并且如果目标types是交集types,则交集中提到的每个其他接口types。
  • 在方法引用expression式具有typesU ,对于U的每个非static成员方法m

    如果U的函数types具有m的签名的子签名,则该类声明一个覆盖m调用方法 。 调用方法的主体调用被引用的方法,创建一个类实例,或创建一个数组,如下所述。 如果调用方法的结果不是void ,那么在任何必要的赋值转换(§5.2)之后,主体将返回方法调用或对象创建的结果。

    如果被擦除的方法的types与擦除U的函数types的签名不同,则在方法调用或对象创建之前,调用方法的主体将检查每个参数值是否是子类的实例,或者在U的functiontypes中删除相应参数types的子接口; 如果不是,则抛出ClassCastException

  • 虽然可以重写Object类的方法,但该类不会重写上述函数接口types或其他接口types的其他方法。