2016-03-01 49 views
1

在我的自定義數據集中,我使用RMI服務器中的構造函數來創建我的類的新實例。反射AccessControlException

Constructor<?> constructor = dynTable.getDeclaredConstructor(Class.class); 
constructor.setAccessible(true); // <-- Exception here 
... = constructor.newInstance(type); 
constructor.setAccessible(false); 

但是,如果我設置了SecurityManager,則會在下面引發預期。

java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457) 
    at java.security.AccessController.checkPermission(AccessController.java:884) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:128) 
    at net.sviglas.meridian.task.DefaultDatasetConstructor$1.constructDataset(DefaultDatasetConstructor.java:45) 
... 

服務器端和客戶端的策略文件:

grant { 
    permission java.security.AllPermission; 
}; 

我給了允許的一切,但我仍然收到此安全異常。你知道爲什麼嗎?

+0

請勿對不是代碼的文本使用代碼格式。 – EJP

回答

0

您在不允許的安全上下文中調用setAccessible()。你需要調整你的.policy文件。顯然你的一個allPermission沒有被加載。您需要使用-Djava.security.debug=access,failure執行您的代碼以查看哪些安全策略生效。

這與RMI無關,只是除非您使用代碼庫功能,否則根本不需要安全管理器。

我也想知道爲什麼你所調用的構造函數尚未公開。

+0

我將使用代碼庫的未來,所以我需要這個。我如何確定我使用我的策略文件? – g3d

+0

另外,有趣的是它在第一次後有效。服務器第二次嘗試正常工作。 – g3d

+0

*我已經告訴你*如何確定安全策略。 – EJP