2016-03-01 90 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