代码之家  ›  专栏  ›  技术社区  ›  raisercostin

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

  •  3
  • raisercostin  · 技术社区  · 16 年前

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

    有可能吗?

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

    3 回复  |  直到 10 年前
        1
  •  6
  •   Mario Ortegón    16 年前

    您可以编写一个小型加载程序来创建 new, custom classloader . 然后可以使用这个类加载器加载应用程序类。

    在自定义类加载器中,当应用程序试图访问要列入黑名单的类时,可以抛出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()调用委托给父类加载器,所以您可以将需要的任何类列入黑名单。

        2
  •  1
  •   Maarten Winkels    16 年前

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

        3
  •  0
  •   sleske    16 年前

    http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

    没有提到类的创建/加载,所以我相信您不能使用策略强制执行它。

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

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

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