1

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

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

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

任何提示在哪里查看或有关其工作原理的见解?

4

1 回答 1

3

这都是关于 SecurityManager 的。

默认情况下,没有安装 SecurityManager(这就是所有权限检查检查 SM 可用性的原因)。这是您的默认设置 - 一切都很好。

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

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

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

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

将启用权限。

于 2012-05-05T08:03:57.000 回答