2012-05-04 155 views
0

我想了解在哪些条件下调用Method.setAccessible()是允许的。据我了解文档的各个部分,调用setAccessible()会触发SecurityManager中的检查,以查看是否允许更改访问修饰符。什么是默认的ReflectPermissions以及如何更改它们?

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

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

任何提示看看或见解如何工作?

+0

您可以从Sun的[安全和权限]页面开始(http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html)。关于suppressAccessChecks的部分反映了权限的部分是〜1/3,这是它检查setAccessible的地方。 – Thomas

+0

@Thomas,是的。但它并不会谈论违约来自哪里,即谁拥有该许可。其余的SecurityManager文档通常谈到如何设置权限和类似的东西,并提到中央java.policy文件。但在我的安装中没有设置ReflectPermissions,所以它必须来自其他地方。 – Jochen

回答

3

这都是关于SecurityManager的。

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

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

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

要重新启用它,您必须更改策略文件(如果默认策略处于活动状态,如果不是 - >请阅读运行环境的文档)。使访问者可访问是一个巨大的更改 - 所以仔细检查您的要求和运行环境的要求是否仍然兼容。例如,对普通applet进行这种更改会严重影响安全性。

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

将启用权限。

+0

谢谢。这清除了我的担忧。 – Jochen

+0

请注意,一旦您授予了该权限,任何代码都可以删除安全管理器。 –

相关问题