5

我想在我的jdk6\jre\lib\security\java.policy文件中添加一个禁止创建一些被 appengine 列入黑名单的类。例如,我希望本地 jvm 在应用程序尝试实例化时抛出异常javax.naming.NamingException

有可能的?

我将尝试在这里解释我的具体问题。Google 提供的服务(GAE-google 应用引擎)对可以使用的类有一些限制。例如,不实例化 javax.naming 包中的 JNDI 类。他们还提供了一个测试服务器,可以用来在我的机器上测试这个应用程序,但是这个服务器允许这样的类并且可以执行代码。只有在将应用程序上传到 google 后,您才会发现自己使用了列入黑名单的课程。我在想是否不能在开发 jvm 上执行此类黑名单强制执行。否则,我认为这很容易,他们可能已经提供了这样的策略文件。

4

3 回答 3

6

您可以编写一个小型加载器应用程序来创建一个新的自定义类加载器。然后可以使用这个类加载器加载您的应用程序类。

在自定义类加载器中,当您的应用程序尝试访问您想要列入黑名单的类时,您可以抛出 ClassNotFoundException。

您将需要重载 load() 方法。此方法将负责在您的黑名单类上抛出异常,或者如果允许该类,则委托给父类加载器。示例实现:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(当然,真正的实现可能比这更复杂)

因为您的应用程序的类是通过此 Classloader 加载的,并且您只是在需要时将 loadClass() 调用委托给父类加载器,因此您可以将所需的任何类列入黑名单。

我很确定这是 Google 用来将其服务器中的类列入黑名单的方法。他们在特定的类加载器中加载每个应用程序。这也类似于 Tomcat 隔离不同 Web 应用程序的方式。

于 2009-06-17T14:57:38.080 回答
1

在测试程序时,您是否宁愿得到编译错误而不是运行时错误?您可以配置您的 IDE 或编译器,以便在实例化不需要的类时向您发出警告。我知道 AspectJ 有一些很好的特性:您可以在连接点上定义编译警告/错误,并在例如 Eclipse 中获得反馈。要在 Eclipse 中使用它,您只需安装 AspectJ 插件并编写合适的方面。要在从命令行或脚本编译时出现错误,您实际上必须使用 AspectJ 编译器,但我怀疑您是否需要它。

于 2009-06-19T19:11:48.177 回答
0

Java 文档在此处列出了所有可能的策略权限:http: //java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

未提及类创建/加载,因此我相信您无法使用策略强制执行此操作。

无论如何,为什么要在加载异常类时抛出异常?也许您可以解释您的问题,然后有人可以提出解决方案。

编辑:

防止加载某些类的一种方法是从 JRE 安装中删除它们。大多数系统类都包含在 JDK/JRE 安装中的 rt.jar 中。您应该可以使用任何 ZIP 工具对其进行修改。

只需创建一个特殊的 JRE 安装,然后修改它的 rt.jar。这是一个丑陋的黑客,但应该可以用于测试目的......

于 2009-06-15T00:06:08.697 回答