情境:
我有一个必须使用.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中。不适合普通网络硬汉。
答案 0 :(得分:3)
field.setAccessible(true)始终是hacky和notocumented。它改变了私人领域!也许你很幸运,它适用于所有支持的JVM,并且它在将来的任何时候都不会改变。
我还担心如果JVM在您更改路径之前由于某种原因在之前的java.library.path中找到并加载了您的dll版本会发生什么。我想它会保留加载的版本,而不是加载新版本。
如果您在受控环境中工作,您可能会忽略这些问题,但我建议您找到另一种解决方案。例如。告诉用户使用简单的安装程序远程安装dll。