2012-05-04 66 views
0

我想了解在哪些條件下調用Method.setAccessible()是允許的。據我瞭解文檔的各個部分,調用setAccessible()會觸發SecurityManager中的檢查,以查看是否允許更改訪問修飾符。什麼是默認的ReflectPermissions以及如何更改它們?

鑑於此,我試圖找出該權限的默認設置是什麼,以及我可以在哪裏更改它。在中央的java.policy文件中,沒有提到這些權限,也找不到任何其他策略文件生效,而且我也找不到有關SecurityManager可能應用的默認值的任何其他文檔。

我試圖弄清楚這一點的主要原因是我使用反射來規避訪問修飾符。我想知道我要告訴客戶我的代碼有關如何爲他們做這項工作。

任何提示看看或見解如何工作?

+0

您可以從Sun的[安全和權限]頁面開始(http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html)。關於suppressAccessChecks的部分反映了權限的部分是〜1/3,這是它檢查setAccessible的地方。 – Thomas

+0

@Thomas,是的。但它並不會談論違約來自哪裏,即誰擁有該許可。其餘的SecurityManager文檔通常談到如何設置權限和類似的東西,並提到中央java.policy文件。但在我的安裝中沒有設置ReflectPermissions,所以它必須來自其他地方。 – Jochen

回答

3

這都是關於SecurityManager的。

默認情況下,不安裝SecurityManager(這就是爲什麼所有權限檢查都會檢查SM可用性的原因)。這是你的默認 - 一切都很好。

某些啓動程序(如applet環境)將安裝SecurityManager,SecurityManager默認使用基於策略文件的策略。你可以在「java.security」文件中改變它。其他環境(如servlet容器或Java EE容器)也可以安裝SecurityManager。

在此之後,java安全性已到位。默認情況下,您的代碼不能再調用「setAccessible」。

要重新啓用它,您必須更改策略文件(如果默認策略處於活動狀態,如果不是 - >請閱讀運行環境的文檔)。使訪問者可訪問是一個巨大的更改 - 所以仔細檢查您的要求和運行環境的要求是否仍然兼容。例如,對普通applet進行這種更改會嚴重影響安全性。

grant { 
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
}; 

將啓用權限。

+0

謝謝。這清除了我的擔憂。 – Jochen

+0

請注意,一旦您授予了該權限,任何代碼都可以刪除安全管理器。 –

相關問題