標籤:http io ar 使用 sp java strong on 資料
http://www.infoq.com/cn/news/2013/07/Oracle-Removes-getCallerClass
作為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
感謝馬國耀對本文的審校。
轉:Oracle棄用sun.reflect.Reflection.getCallerClass