我想添加到我的jdk6\jre\lib\security\java.policy文件遮断创建由AppEngine上黑名单一些类。例如,我希望在应用程序试图实例javax.naming.NamingException我的本地JVM抛出异常。

有可能的?

我会尽量在这里解释我的具体问题。谷歌提供的有一定的局限性什么可以用来类的服务(GAE,谷歌应用程序引擎)。例如不实例是在javax.naming包JNDI类。他们还提供了可用于测试该应用程序在我的机器上测试服务器,但该服务器允许这些类和可exacute代码。你发现你使用黑名单类,你将应用程序上传到谷歌之后。我在想,如果这种类黑名单执法不能在发展的JVM来完成。否则,我在想,这将是很容易,他们可能已经提供了这样的政策文件。

有帮助吗?

解决方案

您可以编写创建一个新的小型装载机的应用,定制ClassLoader 。你的应用类可以然后使用此类加载器加载。

在自定义类加载器,你就可以抛出的ClassNotFoundException当应用程序试图访问要列入黑名单的一类。

您需要重载load()方法。这种方法将负责扔在你的黑名单类ordelegating父类加载器的异常,如果类是允许的。实现示例:

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);
}

(当然,实际的实现中可以是方式比此更复杂的)

由于您的应用程序的类通过这个类加载器加载,当你想,你可以黑名单,你需要的任何类你只委派的loadClass()invokations父类加载器。

我敢肯定,这是谷歌使用黑名单他们的服务器类的方法。他们使每一个应用程序在一个特定的类加载器。这也类似于Tomcat的隔离不同的Web应用程序的方式。

其他提示

难道你而获得比运行错误编译错误在测试你的程序?你可以配置你的IDE或编译器警告你,当不希望的类实例化。我知道的AspectJ有这一些不错的功能:您可以定义编译警告/上联结点错误,例如在得到反馈日食。在Eclipse中使用此功能,您只需安装插件的AspectJ和写一个合适的方面。为了获得,而通过命令行或脚本编译错误,你会真正使用AspectJ编译器,但我怀疑,你将需要这一点。

在Java文档中列出了所有在这里可能的政策权限: http://java.sun.com/javase/ 6 /文档/技术说明/指南/安全/ permissions.html

创建类没有提到/加载,所以我相信使用策略,你不能强制这一点。

在任何情况下,你为什么要在装入异常类抛出一个异常?也许你能解释一下你的问题,然后有人也许能够提出一个解决方案。

修改

,以防止某些类的装载的一个方法就是,从JRE安装删除它们。大多数系统类包含在rt.jar中在你的JDK / JRE安装。你应该能够与任何ZIP工具来修改它。

只要创建你的JRE的特殊安装,并修改其rt.jar中。这是一个丑陋的黑客攻击,而应该是出于测试目的OK ......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top