强制JVM重新加载“java.library.path”是一个坏主意吗?

时间:2012-01-12 16:00:17

标签: java path applet

情境:

我有一个必须使用.dll的applet。 那个.dll必须生活在PATH上。 为了通过applet获取PATH上的.dll,运行浏览器的用户必须具有管理权限(通常作为右键单击图标以管理员身份运行...)。

问题:

我希望不再需要获得行政许可。

糟糕的主意 我想让applet将文件保存在用户主目录中的某个位置。我想将这条路径添加到PATH。显然,可以通过以下方式完成:

    System.setProperty("java.library.path", <new path>);

    try {
        // this forces JVM to reload "java.library.path" property 
        Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); 
        fieldSysPath.setAccessible( true ); 
        fieldSysPath.set( null, null );
    } catch (Exception e) {
        e.printStackTrace();
        init_failure = true;
    } 

问题

强制JVM执行此操作是一个坏主意吗?这是使用未记录的方法/它只是简单的hacky?

其他位

因为这是一个applet,我不能通过-D选项指定java.library.path,对吗?

此代码位于Intranet中。不适合普通网络硬汉。

1 个答案:

答案 0 :(得分:3)

field.setAccessible(true)始终是hacky和notocumented。它改变了私人领域!也许你很幸运,它适用于所有支持的JVM,并且它在将来的任何时候都不会改变。

我还担心如果JVM在您更改路径之前由于某种原因在之前的java.library.path中找到并加载了您的dll版本会发生什么。我想它会保留加载的版本,而不是加载新版本。

如果您在受控环境中工作,您可能会忽略这些问题,但我建议您找到另一种解决方案。例如。告诉用户使用简单的安装程序远程安装dll。