我想知道Java类是否有办法弄清楚它是否在applet中使用?
也就是说,我有一个可供第三方应用程序和applet使用的库(.jar文件)。它确实在applet中工作,但我想做一些不同的事情,这取决于是否在applet中使用库 - 比如显示applet适用的错误,避免本地文件I / O等。
如果Applet.getAppletContext()是静态的,那么即使我没有applet实例,也可以调用它(并获得NULL或非NULL),这样会很好,但是唉,它不是。还有其他办法吗?
答案 0 :(得分:2)
检测它是否作为applet运行的另一种方法是在发生安全性异常时使用回退方法。当在另一个环境中使用时,这将是有利的,例如具有安全上下文的servlet容器。
示例:
try {
File file = new File("c:\\test.txt");
System.out.println("Exists? " + file.exists());
} catch (java.security.AccessControlException e) {
// fallback
}
答案 1 :(得分:1)
根据Java Security Overview Whitepaper(第14页第2段)
Java applets和Java™Web Start 应用程序自动运行 安装了SecurityManager。 但是,本地应用程序已执行 通过java命令是默认的 不能使用SecurityManager运行 安装。
这应该意味着对System.getSecurityManager()的调用将在applet中返回非null,并且当不在applet中时将返回null。例外是可能的,例如,可以在运行程序时从命令行指定安全管理器。
boolean insideApplet()
{
return null != System.getSecurityManager();
}
答案 2 :(得分:1)
可能最安全的方法是让用户告诉你它是否在applet中(只需将“boolean”变量添加到适当的构造函数和/或方法中。
当然,你想要一些更自动的东西来避免这种情况,但据我所知,没有确定的方法来了解如何在虚拟机上运行程序。我可能会首先看看像他/她的回答中建议的安全管理器,但不只是寻找null我会检查它是什么类型。我环顾了一下,但没有发现applet使用的安全管理器类是否有任何“标准”名称。
最后,最安全的方法是让图书馆的用户自行决定,因为他们将拥有所需的信息。