在测试程序时,您是否宁愿获得编译错误而不是运行时错误?您可以配置IDE或编译器,以在实例化不需要的类时向您发出警告。我知道AspectJ有一些很好的功能:你可以在连接点上定义编译警告/错误并获得反馈,例如:日食。要在Eclipse中使用它,只需安装AspectJ插件并编写合适的方面即可。要在从命令行或脚本编译时获取错误,您实际上必须使用AspectJ编译器,但我怀疑您是否需要它。
Java文档列出了所有可能的策略权限: http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html
未提及类创建/加载,因此我认为您无法使用策略强制执行此操作。
无论如何,为什么要在加载异常类时抛出异常?也许你可以解释你的问题,然后有人可能会提出解决方案。
的 编辑: 强>
防止加载某些类的一种方法是从JRE安装中删除它们。大多数系统类都包含在JDK / JRE安装中的rt.jar中。您应该能够使用任何ZIP工具对其进行修改。
只需创建JRE的特殊安装,并修改其rt.jar。这是一个丑陋的黑客,但应该可以用于测试目的......
你可以写一个小的加载器应用程序来创建一个 新的自定义类加载器 。然后可以使用此类加载器加载您的应用程序类。
在自定义类加载器中,当应用程序尝试访问要列入黑名单的类时,可以抛出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); }
(当然,真正的实现可能比这更复杂)
因为应用程序的类是通过此类加载器加载的,并且您只是在需要时将loadClass()调用委托给父类加载器,所以可以将所需的任何类列入黑名单。
我很确定这是Google用来将服务器中的类列入黑名单的方法。他们加载特定类加载器中的每个应用程序。这也类似于Tomcat隔离不同Web应用程序的方式。