我需要调用一些半可信的 Java 代码,并希望在该代码的执行期间禁用使用反射的能力。
try{
// disable reflection somehow
someObject.method();
}
finally{
// enable reflection again
}
这可以用 SecurityManager 来完成吗?如果可以,怎么做?
澄清/上下文:这是对 another question 的跟进关于限制可以从 JavaScript/Rhino 调用的包。接受的答案引用了一篇关于如何做到这一点的博客条目,它需要两个步骤,第一个使用 Rhino API (ClassShutter),第二个关闭反射和 Class.forName()。我想我可以使用 SecurityManager 更干净地完成第二步(学习 SecurityManager,正如已经指出的那样,它是一个复杂的野兽,一路走来)。
总而言之,我想(从代码,而不是设置文件)关闭 Class.forName() 和对整个反射包的任何访问。
最佳答案
这取决于您要限制的内容。
一般而言,可公开访问的 API 不受限制。但是,只要您不授予不可信代码 ReflectPermission("suppressAccessChecks")
许可,它将无法访问另一个包中的非公共(public) API。
如果您有一个要限制所有访问的包列表,则有两个步骤。首先,在 Security
属性中,include the restricted package in the package.access
list .然后给你的信任代码RuntimePermission("accessClassInPackage."+ pkg)
。
区分不受信任代码的常用方法是从不同位置加载它,并在授予权限时引用策略文件中的不同代码库。
Java安全架构很强大,但我知道它也很复杂;如果你想要一个更具体的例子,请准确描述你想要限制的调用,我会尽量更明确。
在不修改 java.policy
文件和/或 java.security
文件的情况下做你想做的事是非常困难的,也许是不可能的。 java.security.Policy
表示 java.policy
中的信息,但它不提供写入权限。只要现有的 SecurityManager
允许,您就可以创建自己的 Policy
实现并在运行时安装它。
另一方面,您可以将自定义 java.policy 文件指定为命令行选项。如果您要提供带有某种启动器的完整应用程序,那可能很容易实现。它还为您的用户提供了一些透明度。经验丰富的用户可以查看您希望授予应用程序的权限。
关于java - 为当前线程禁用 Java 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770635/