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 )关注我们,并与我们的编辑和其他读者朋友交流。
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论