什么是默认的ReflectPermissions以及如何更改它们?

时间:2012-05-04 20:29:22

标签: java security reflection permissions

我正在尝试了解允许调用Method.setAccessible()的条件。据我所知,文档的各个部分,调用setAccessible()会触发SecurityManager中的检查,以查看是否允许更改访问修饰符。

鉴于此,我试图找出此权限的默认设置是什么,以及我可以在哪里更改它。在中央java.policy文件中,没有提到这些权限,我找不到任何其他生效的策略文件,我也找不到任何有关SecurityManager可能适用的默认值的文档。

我试图解决这个问题的主要原因是我正在使用反射来规避访问修饰符。而且我想知道我必须告诉客户我的代码如何让他们为他们工作。

任何提示在哪里查看或了解其工作原理?

1 个答案:

答案 0 :(得分:3)

这完全是关于SecurityManager的。

默认情况下,不安装任何SecurityManager(这就是所有权限检查检查SM可用性的原因)。这是你的默认值 - 一切都很好。

某些启动程序(如applet环境)将安装SecurityManager,而SecurityManager默认使用基于策略文件的策略。您可以在“java.security”文件中更改此设置。其他环境(如servlet容器或Java EE容器)也可以安装SecurityManager。

在此之后,java安全性已经到位。默认情况下,您的代码不能再调用“setAccessible”。

要重新启用此功能,您必须更改策略文件(如果默认策略处于活动状态,如果不是 - 请>阅读您正在运行的环境的文档)。使访问者可访问是一个巨大的更改 - 因此请仔细检查您的要求和运行时环境的要求是否仍然兼容。例如,对普通applet进行此更改将严重损害安全性。

grant  {
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

将启用权限。