反射AccessControlException

时间:2016-03-01 09:22:18

标签: java security exception reflection rmi

在我的自定义数据集中,我使用RMI服务器中的构造函数来创建我的类的新实例。

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;
};

我允许一切,但我仍然得到这个安全例外。你知道为什么吗?

1 个答案:

答案 0 :(得分:0)

您在不允许的安全上下文中调用setAccessible()。您需要调整.policy文件。很明显,没有加载allPermission的{​​{1}}。您需要使用-Djava.security.debug=access,failure执行代码,以查看有效的安全策略。

这与RMI无关,除非您使用代码库功能,否则您根本不需要安全管理器。

我也想知道为什么你打电话的构造函数还没有公开。