有什么办法可以完全禁用Java安全管理器?

我正在尝试db4o的源代码。它使用反射来保留对象,并且似乎安全管理器不允许反射来读取和写入私有(private)或 protected 字段。

我的代码:

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()不可用。私有(private)字段无法存储。
已检索(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个小时在此上,对如何进行这项工作没有任何想法。
任何帮助表示赞赏。

最佳答案

您可以尝试将其添加到程序的main()中:

System.setSecurityManager(null);

当我遇到安全管理器问题时,为我为“受信任的” WebStart应用程序工作。不知道它是否适合您的db4o情况,但是可能值得尝试。

编辑:我不建议这是安全管理器问题的一般解决方案。我只是提议将其作为一种方法来调试原始海报的问题。显然,如果您想从安全管理器中受益,则不应禁用它。

08-04 13:47