检测Applet上下文(我在applet中吗?)

时间:2010-03-18 16:32:44

标签: java applet

我想知道Java类是否有办法弄清楚它是否在applet中使用?

也就是说,我有一个可供第三方应用程序和applet使用的库(.jar文件)。它确实在applet中工作,但我想做一些不同的事情,这取决于是否在applet中使用库 - 比如显示applet适用的错误,避免本地文件I / O等。

如果Applet.getAppletContext()是静态的,那么即使我没有applet实例,也可以调用它(并获得NULL或非NULL),这样会很好,但是唉,它不是。还有其他办法吗?

3 个答案:

答案 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使用的安全管理器类是否有任何“标准”名称。

最后,最安全的方法是让图书馆的用户自行决定,因为他们将拥有所需的信息。