Oracle 复活 getCallerClass 方法,至少现在如此

  • Vikram Gupta
  • 马德奎

2013 年 8 月 15 日

话题:JavaOracle语言 & 开发架构

Oracle 在今年七月初宣布,将终止 Java 方法 sun.reflect.Reflection.getCallerClass()的使用。现在 Oracle 弃用该方法的想法减弱了,Oracle Java 平台组首席架构师 Mark Reinhold 于上周四在推特上发布如下通告:

@CedricChampeau @glaforge 我们将在 7u40 中恢复 getCallerClass(int)方法。它在 Java 8 中的命运尚有待观察。

Cédric Champeau 在推特上转发了如下评论:

好消息:JDK 的各位开发人员决定在 1.7u40 中把 getCallerClass 方法恢复原状,1.8.#groovy 和日志系统将不会受到破坏:-)

Champeau 是 Groovy 编程语言的主要提交者,他在 VMWare 的 Pivotal 部门工作。该部门还是 SpringSource 的拥有者,同时也是 Groovy 的当前支持者。Guillaume Laforge 是 SpringSource 的 Groovy 开发负责人。

Reflection 类位于调用栈中的 0 帧位置,sun.reflect.Reflection.getCallerClass()方法返回调用栈中从 0 帧开始的第 x 帧中的类实例。该方法提供的机制可用于确定调用者类,从而实现“感知调用者(Caller Sensitive)”的行为,即允许应用程序根据调用类或调用栈中的其它类来改变其自身的行为。

Oracle 很快发出警告,调用 getCallerClass()方法以及任何 sun.* 包中的任意方法都有可能导致程序不健壮和不一致,文章“为什么开发人员不应该调用‘sun’包”描述了其中的具体原因。读者可以在OTN 问题跟踪系统上跟踪弃用公告。

因为 Groovy 依赖该方法,所以 Cédric Champeau 早早地披露了这条弃用信息。

不仅 Groovy 受到了影响,Grails 的问题跟踪系统上也发布了相关 Bug

包括 GitHub 在内的一些公共源代码搜索引擎的搜索结果显示,有一系列的项目依赖 getCallerClass()方法,包括几个活跃的 Oracle 项目,如 Jigsaw 项目和 Lambda 项目,还有第三方项目,如 IntelliJ IDEA。

查看英文原文:Oracle Resurrects getCallerClass, At Least for Now


感谢马国耀对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

JavaOracle语言 & 开发架构