我可以通过配置java.policy文件拒绝访问jvm类吗?

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

有可能的?

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

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

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

您将需要重载load()方法。 如果允许该类,此方法将负责将exception抛出到列入黑名单的类中或排除到父类加载器。 示例实现:

 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()调用委托给父类加载器,所以可以将所需的任何类列入黑名单。

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

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

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

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

无论如何,为什么要在加载exception类时抛出exception? 也许你可以解释一下你的问题,然后有人可能会提出解决方案。

编辑:

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

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