【发布时间】:2010-10-20 05:35:49
【问题描述】:
有没有办法完全禁用 Java 安全管理器?
我正在试验 db4o 的源代码。它使用反射来持久化对象,似乎安全管理器不允许反射读取和写入私有或受保护的字段。
我的代码:
public static void main(String[] args) throws IOException {
System.out.println("start");
new File( DB_FILE_NAME ).delete();
ObjectContainer container = Db4o.openFile( DB_FILE_NAME );
String ob = new String( "test" );
container.store( ob );
ObjectSet result = container.queryByExample( String.class );
System.out.println( "retrieved (" + result.size() + "):" );
while( result.hasNext() ) {
System.out.println( result.next() );
}
container.close();
System.out.println("finish");
}
输出:
开始 [db4o 7.4.68.12069 2009-04-18 00:21:30] AccessibleObject#setAccessible() 不可用。不能存储私有字段。 检索到 (0): 结束
This thread 建议修改 java.policy 文件以允许反射,但它似乎对我不起作用。
我正在使用参数启动 JVM-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
所以指定的策略文件将是唯一使用的策略文件
文件如下所示:
授予 { 权限 java.security.AllPermission; 权限 java.lang.reflect.ReflectPermission "suppressAccessChecks"; };我在这上面花了 3 个小时,但不知道如何使它工作。 任何帮助表示赞赏。
【问题讨论】:
-
您是否尝试过从您自己的代码中调用 setAccessible 或其他特权操作?
-
完整的命令行也可能有用。
-
你的虚拟机参数正确吗?你似乎有 -Djava.security.policy== ?
-
@Brian: double '=' 表示指定文件是唯一使用的策略文件。单个“=”表示指定文件将与标准策略文件一起使用。至少那是读过的内容。
-
@Tom:我可以在我的代码中调用 setAccesible,这很奇怪,因为我的代码是我在 db4o 源代码中添加的一个类。然而,同一个 db4o 似乎无法访问 setAccesible。也许这是 db4o 中的一个错误?
标签: java security reflection db4o