java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which) 方法丟擲一個SecurityException如果呼叫執行緒不允許存取的成員。預設的策略是允許存取公共成員,以及存取具有相同的類載入器的呼叫者類。在所有其他情況下,此方法呼叫checkPermission與RuntimePermission(“accessDeclaredMembers”)許可權。
如果這種方法被重寫,然後呼叫super.checkMemberAccess無法進行,因為checkMemberAccess預設實現依賴於程式碼被檢查處於4的堆疊深度。
以下是java.lang.SecurityManager.checkMemberAccess()方法的宣告
public void checkMemberAccess(Class<?> clazz, int which)
clazz -- 要執行反射的類。
which -- 存取型別,公共或宣告。
此方法沒有返回值。
SecurityException --如果呼叫者沒有許可權存取的成員。
NullPointerException -- 如果clazz引數為null。
我們的範例中,需要為每個命令的許可權被阻止。一項新的規則檔案設定,僅允許建立和安全管理器的設定。該檔案位於C:/java.policy,包含以下文字:
grant { permission java.lang.RuntimePermission "setSecurityManager"; permission java.lang.RuntimePermission "createSecurityManager"; permission java.lang.RuntimePermission "usePolicy"; };
下面的例子顯示lang.SecurityManager.checkMemberAccess()方法的使用。
package com.yiibai; import java.lang.reflect.Member; public class SecurityManagerDemo extends SecurityManager { // checkMemberAccess needs to be overriden. @Override public void checkMemberAccess(Class<?> clazz, int which) { throw new SecurityException(); } public static void main(String[] args) { // set the policy file as the system securuty policy System.setProperty("java.security.policy", "file:/C:/java.policy"); // create a security manager SecurityManagerDemo sm = new SecurityManagerDemo(); // set the system security manager System.setSecurityManager(sm); // perform the check sm.checkMemberAccess(SecurityManagerDemo.class, Member.PUBLIC); // print a message if we passed the check System.out.println("Allowed!"); } }
讓我們來編譯和執行上面的程式,這將產生以下結果:
Exception in thread "main" java.lang.SecurityException