作为 Java 开发者,我们经常忽略 @Deprecated 注释,继续使用这些功能,即使我们很清楚 Oracle 会在某个时间拿到这一标签,但仍然幻想着这些标签像刻在石头上那样不可磨灭。
从 jdk 7u40 开始,Oracle 已经弃用了 sun.reflect.package 包里不易理解的 Reflection.getCallerClass(int)方法。在 Java 7 中,通过设置 Java 命令行选项 Djdk.reflect.allowGetCallerClass,可以继续使用该方法。但在 Java 8 及以后的版本中,该方法将被彻底删除,调用它会导致 UnsupportedOperationException 异常。
根据 Java 文档,Reflection 类位于调用栈中的 0 帧位置,该方法返回调用栈中从 0 帧开始的第 x 帧中的类。总之,getCallerClass 方法提供的机制可用于确定调用者,从而实现“感知调用者(Caller Sensitive)”的行为,即根据调用类或调用栈中的其它类来调整其自身的行为。
JDK 团队希望知道 getCallerClass 方法在应用程序中是如何使用的,能否修改这些代码使之不再依赖任何 sun.* API。你可以加入 OpenJDK core-dev-libs 邮件列表来反馈意见。
多年来,Oracle 一直在提醒开发者,调用 sun.* 包里面的方法是危险的。关于这点,读者可以阅读 Oracle 博客上的说明文章“为什么开发人员不应该调用‘sun’包”。总之,使用这些已弃用的特性很容易出问题。随着平台的变化,它们可能随时被转移、删除或者更改语义。
然而,如果你使用了感知调用者的行为,也无需失去信心。JDK 增强提案( JEP176 )呼吁提高 JDK 方法处理的实现的安全性,使用可以可靠地识别的感知调用者方法的机制代替现有的人工维护的方法列表。
继续关注该问题,可以访问 Oracle Bug 数据库。
参考英文原文: Oracle Discontinuing sun.reflect.Reflection.getCallerClass
感谢马国耀对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ ;)或者腾讯微博( @InfoQ ;)关注我们,并与我们的编辑和其他读者朋友交流。
评论