jdk8允许接口有默认实现
Mark Reinhold对JDK 9提出了一个新建议:默认情况下,在JDK 9中允许从类路径上的代码进行非法反射访问,并在以后的版本中禁止它。 他在给OpenJDK邮件列表的一封邮件中写道:“ JDK内部API的强大封装引发了许多令人担忧的表达,即今天可在JDK 8上运行的代码明天将无法在JDK 9上运行,但是对此更改没有预先警告是在JDK 8中给出的。”
为了帮助生态系统“以更加轻松的速度迁移到模块化Java平台”,Reinhold建议在JDK 9中默认允许从类路径上的代码进行非法反射访问,并在以后的版本中禁止使用。
这到底是什么意思?
Oracle公司Java平台小组的首席架构师解释说,现有的–permit-illegal-access选项的“大杀手”将成为JDK 9运行时系统的默认行为,但强调不会尽可能多的警告。 他还补充说,JDK 9的当前行为(不允许从类路径上的代码进行非法的反射访问操作)在将来的发行版中将成为默认行为,并且在编译时不会发生任何变化。
Reinhold写道,最近引入的“ –permit-非法访问”选项将由更通用的选项“ –非法访问”代替。
此选项将采用单个关键字参数,如下所示:
“ –非法访问=许可”
这将是JDK 9的默认模式。它将打开每个显式模块中的每个包,以在所有未命名模块中进行编码,即在类路径上进行编码,就像今天的–permit-illegal-access一样。
第一个非法的反射访问操作会导致发出警告,就像“ -permit-非法访问”一样,但是此后没有发出警告。 此单个警告将描述如何启用进一步的警告。
“ –illegal-access =警告”
这将导致对每个非法的反射访问操作发出警告消息。 这等效于当前的“ –permit-非法访问”选项。
“ –非法访问=调试”
这将导致为每个非法的反射访问操作显示警告消息和堆栈跟踪。 这等效于将今天的–permit-非法访问选项与-Dsun.reflect.debugModuleAccessChecks结合使用。
“ –非法访问=拒绝”
除了其他命令行选项(例如,“ – add-opens”)启用的操作之外,这将禁用所有非法的反射访问操作。 在将来的版本中,它将成为默认模式。
含义
Reinhold警告说:“ 建议的默认模式使运行时系统可以在启动后很长一段时间内发出警告消息 ,而无需明确要求这样做。 这在生产环境中可能会令人感到意外,因为运行时系统根本不会发出任何警告消息,这是非常不寻常的。 但是,如果默认模式允许非法反射访问,则必须将其公开,以便在以后的版本中不再是默认模式时,使人们感到惊讶。”
他补充说,通过谨慎使用–add-exports和–add-opens选项, 可以避免在任何模式下发出警告消息(就像以前一样)。
如果通过, 该提案将需要对JEP 260“封装大多数内部API”进行一些更改 。 尽管从模块中的代码角度来看,JDK内部的API仍将被强力封装(无论这些模块是自动的还是显式的),但从类路径上的代码角度来看,它们似乎不会在运行时被封装。
此外,当“拒绝”成为默认模式时, Reinhold希望“ permit”至少在一个版本中仍受支持 ,以便开发人员可以继续迁移其代码。 值得一提的是,随着时间的流逝,“许可”,“警告”和“调试”模式将被删除,“ –非法访问”选项也会发生同样的事情。
可能要掌握的最重要的事情是,即使提案被采纳并且变更生效, 也不会“神奇地解决每个JDK 9的采纳问题 。内置类装入器的具体类型仍然不同,`rt .jar`仍然消失,系统映像的布局仍然不相同,并且版本字符串仍具有新格式。”
提案React
Gradle,Inc.的核心开发人员CédricChampeau认为该提议“ 非常合理 ”,而Michael Nascimento同意该折衷方案是“ 经过深思熟虑的 ”。 后者补充说:“现实世界的应用程序需要此,这是非常可喜的举动。”
CodeFX的作者Nicolai Parlog认为,“安静”的论点将是“ 有益的 ”,但他声称“将宽大的选择设置为默认值是一个错误的决定,不必要地延长了对生态系统的适当清理而没有任何其他措施”
实际的好处。”
Java的管理员已经警告不要使用内部API 20年了。 拼图宣布将使它们近两年无法访问。 Java 8的支持至少要持续到2018年7月,甚至在此之后,要解决此特定Java 9兼容性问题,只需添加`-permit-illegal-access`。
但是,这还不够吗? 即使添加单个标志也很难吗? 如果花一两个小时阅读JPMS,然后添加该标志的问题太多了,那么人们又怎能期望同一个人清理其代码呢?
由于默认情况下允许非法访问,因此越来越少的开发人员将意识到这一问题,并且图书馆和框架维护者以及项目管理机构将面临更大的压力,要求他们投资以偿还这种特殊形式的技术债务。 因此,我们没有动力进行必要的更改以换取……而不必添加标志? 这太荒谬了,Java社区的Armutszeugnis!
Hazelcast的Christoph Engelbert也为他们的客户提供了一种完全“安静”的模式,并补充说将其设置为Java 9的默认“ 听起来很有意义” 。
同时,Apache Lucene和Solr的提交者兼PMC成员Uwe Schindler认为Reinhold的提议是“ 灾难,因为越野车软件可能会使用大型杀伤力开关”。
翻译自: https://jaxenter.com/jdk-9-replace-permit-illegal-access-134180.html
jdk8允许接口有默认实现