我想在我的 jdk6\jre\lib\security\java.policy
文件中添加一个禁令,以创建一些被 appengine 列入黑名单的类。例如,我希望我的本地 jvm 在应用程序尝试实例化 javax.naming.NamingException
时抛出异常。
有可能吗?
我会尝试在这里解释我的具体问题。 Google 提供的服务(GAE-google 应用程序引擎)对可以使用的类有一些限制。例如,不实例化 javax.naming 包中的 JNDI 类。他们还提供了一个测试服务器,可以用来在我的机器上测试这个应用程序,但是这个服务器允许这样的类并且可以执行代码。只有在将应用程序上传到 google 后,您才发现您使用了一个列入黑名单的类。我在想是否不能在开发 jvm 上执行此类类黑名单强制执行。否则我认为这很容易,他们可能已经提供了这样的政策文件。
最佳答案
您可以编写一个小型加载器应用程序来创建一个 new, custom classloader .然后可以使用此类加载器加载您的应用程序类。
在自定义类加载器中,当您的应用程序尝试访问您要列入黑名单的类时,您可以抛出 ClassNotFoundException。
您需要重载 load() 方法。如果允许该类,此方法将负责在您的黑名单类上抛出异常或委托(delegate)给父类加载器。示例实现:
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() 调用委托(delegate)给父类加载器,所以您可以将所需的任何类列入黑名单。
我很确定这是 Google 用于将其服务器中的类列入黑名单的方法。他们在特定的类加载器中加载每个应用程序。这也类似于 Tomcat 隔离不同 Web 应用程序的方式。
关于java - 我可以通过配置 java.policy 文件来拒绝对 jvm 类的访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/991703/