[英]How to checkMemberAccess(SomeClass.class, Member.DECLARED) in Java 11
給定以下 Java8 代碼,如何在 Java11 中實現? checkMemberAccess()
方法已替換為新的checkPermission()
方法。
Java 8 code:
SecurityManager securityManager = System.getSecurityManager();
securityManager.checkMemberAccess(SomeClass.class, Member.DECLARED);
我想確保我們不能在 SomeClass 上調用 java.lang.Class#getDeclared*()
我知道 Java11 現在有一個SecurityManager.checkPermission()
方法,問題是,我如何在特定的 class 上使用它來檢查我是否有"accessDeclaredMembers"
權限。
我發現了這個類似的問題,但它並沒有告訴我太多。
你寫了
我知道 Java11 現在有一個
SecurityManager.checkPermission()
方法……
但是這種方法自 Java 2 以來就存在,也稱為“JDK 1.2”。 從那時起,其他check…
方法的存在只是為了向后兼容,並委托給checkPermission
方法。 自 Java 2 以來, checkMemberAccess
方法的文檔始終包含以下描述:
默認策略是允許訪問 PUBLIC 成員,以及訪問與調用者具有相同 class 加載器的類。 在所有其他情況下,此方法使用
RuntimePermission("accessDeclaredMembers")
權限調用checkPermission
。
它准確地告訴您當您想在不調用此方法的情況下擁有相同的邏輯時必須做什么。
securityManager.checkPermission(new RuntimePermission("accessDeclaredMembers"));
除了已經記錄在案的怪癖,比如當堆棧深度為 4 的調用者恰好具有與目標 class 相同的 class 加載器時,總是接受訪問。進一步請注意,此 Java 8 版本包含一個描述問題的棄用警告。
所以更大的問題是你想通過電話實現什么。 你寫了
我想確保我們不能在 SomeClass 上調用 java.lang.Class#getDeclared*()
但是這個方法並不能“確保”無論“我們”是誰,都不能訪問成員,它只檢查當前調用者(堆棧深度為 4)是否可以訪問指定 class 的該方法。
為確保無法進行此訪問,您必須確保潛在的調用者已由不同的 class 加載程序加載(如文檔所述,由相同的 class 加載程序加載的類始終獲得訪問權限)。 然后,您必須配置安全管理以撤銷RuntimePermission("accessDeclaredMembers")
。 由於您不知道checkMemberAccess
與該權限之間的關系,我想您從未這樣做過。
在嘗試實際使用安全管理器來阻止該訪問之前(如果可能的話,在您的項目設置中),我必須警告您,那時您將騎着一匹死馬。 JDK 17 將棄用整個SecurityManager
以便移除。 以這種方式限制代碼活動將被刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.