applet中Class.forName(“java.util ...”)上的“禁止包名:java.util”

时间:2012-09-10 03:38:07

标签: java reflection applet securityexception

我有一个引用2个签名罐子的小程序:

  • myapplet.jar
  • 杰克逊 - 全1.9.9.jar

第二次启动applet时(第一次没有错误),我明白了:

Exception in thread "thread applet-main.MyApplet-1"
java.lang.ExceptionInInitializerError
              at org.codehaus.jackson.map.deser.StdDeserializerProvider.<init>(StdDeserializerProvider.java:81)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:398)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:358)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:328)
              at net.Remote.<init>(Remote.java:50)
              at main.Env.init(Env.java:44)
              at main.MyApplet.init(MyApplet.java:25)
              at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
              at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.SecurityException: Prohibited package name: java.util
              at java.lang.ClassLoader.preDefineClass(Unknown Source)
              at java.lang.ClassLoader.defineClassCond(Unknown Source)
              at java.lang.ClassLoader.defineClass(Unknown Source)
              at java.security.SecureClassLoader.defineClass(Unknown Source)
              at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
              at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
              at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
              at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
              at java.lang.ClassLoader.loadClass(Unknown Source)
              at java.lang.Class.forName0(Native Method)
              at java.lang.Class.forName(Unknown Source)
              at org.codehaus.jackson.map.deser.BasicDeserializerFactory.<clinit>(BasicDeserializerFactory.java:74)
              ... 9 more

有问题的行是以下try-catch块中的第一行:

try {
    Class<?> key = Class.forName("java.util.ConcurrentNavigableMap");
    Class<?> value = Class.forName("java.util.ConcurrentSkipListMap");
    @SuppressWarnings("unchecked")
        Class<? extends Map<?,?>> mapValue = (Class<? extends Map<?,?>>) value;
    _mapFallbacks.put(key.getName(), mapValue);
} catch (ClassNotFoundException cnfe) { // occurs on 1.5
}

我不明白的一些事情:

  • 为什么我的Java7 JVM没有将从运行时库中删除?而是
  • 为什么尝试从我的服务器下载/java/util/ConcurrentNavigableMap.class ,这明显会因404而失败?
  • 由于失败,为什么尝试快速连续重新下载myapplet.jar 25次,每次成功(200),每次返回相同的jar文件?

更新我不确定25次重试是否是由尝试加载类的类加载器引起的,可能是其他一些代码尝试加载资源(这仍然是奇怪的,但与CurrentNavigableMap问题无关,所以我会从我的问题中排除这一点。

N.B。我想它不会尝试重新下载jackson jar文件,因为那个文件列在cache_archive属性中。

1 个答案:

答案 0 :(得分:2)

这是吗?

错误:

Class.forName("java.util.ConcurrentNavigableMap");

正确:
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/package-tree.html

Class.forName("java.util.concurrent.ConcurrentNavigableMap");