@FunctionalInterface如何影响JVM的运行时行为?
我最初的问题是这个问题的完全重复; 也就是说,为什么这个接口有一个运行时保留策略。
但是接受的答案根本不能满足我,原因有两个:
- 这个接口是
@Documented
的事实(我相信)与它无关(尽管为什么@Documented
有一个运行时保留策略对我来说也是一个谜); - 尽管在Java 8之前Java中存在许多“将是”function接口(
Comparable
提及,但Runnable
等),这并不妨碍它们被用作“替代品”(例如,你可以很好地使用它)一个DirectoryStream.Filter
作为Predicate
的替代,如果你所做的只是在Path
上过滤,例如)。
但仍然有这种保留。 这意味着它必须以某种方式影响JVM行为。 怎么样?
我在core-libs-dev邮件列表中找到了该线程 ,该列表讨论了@FunctionalInterface
注释的保留。 这里提到的要点是允许第三方工具使用此信息进行代码分析/validation,并允许非Java JVM语言将其lambda正确映射到function接口。 一些摘录:
Joe Darcy ( @FunctionalInterface
原始提交者):
我们故意使这个注释具有运行时保留,以便在运行时也可以查询各种工具等。
Brian Goetz
Java以外的语言有一个好处,可以使用它作为一种方法来确定接口是否适合传递给SAM转换机制。 JDK对lambda转换的支持也可用于其他语言。
所以似乎JVM本身并没有使用它,它只是第三方工具的另一种可能性。 使注释运行时可见并不是一个很大的成本,所以似乎没有强有力的理由不这样做 。
具有保留策略运行时的注释的唯一要求是
注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以reflection性地读取它们。 ( https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicy.html#RUNTIME )
现在这会对运行时行为产生一些影响,因为类加载器必须加载这些annoations,并且VM必须将这些注释保留在内存中以进行reflection访问(例如,通过第三方库)。
但是,不需要VM对这样的注释起作用。