&引用;禁止使用的包名称:java.util;在applet中的Class.forName(“java.util…”)上
我有一个小程序,它引用了2个签名JAR:&引用;禁止使用的包名称:java.util;在applet中的Class.forName(“java.util…”)上,java,reflection,applet,securityexception,Java,Reflection,Applet,Securityexception,我有一个小程序,它引用了2个签名JAR: myapplet.jar jackson-all-1.9.9.jar 当第二次启动小程序时(第一次没有错误),我得到以下信息: Exception in thread "thread applet-main.MyApplet-1" java.lang.ExceptionInInitializerError at org.codehaus.jackson.map.deser.StdDeserializerProvider.&
- myapplet.jar
- jackson-all-1.9.9.jar
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
线程“thread applet main.MyApplet-1”中出现异常
java.lang.ExceptionInInitializeError
位于org.codehaus.jackson.map.desr.StdDeserializerProvider。(StdDeserializerProvider.java:81)
位于org.codehaus.jackson.map.ObjectMapper。(ObjectMapper.java:398)
位于org.codehaus.jackson.map.ObjectMapper。(ObjectMapper.java:358)
位于org.codehaus.jackson.map.ObjectMapper。(ObjectMapper.java:328)
net.Remote.(Remote.java:50)
位于main.Env.init(Env.java:44)
位于main.MyApplet.init(MyApplet.java:25)
位于sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(未知源)
位于java.lang.Thread.run(未知源)
原因:java.lang.SecurityException:禁止的包名称:java.util
位于java.lang.ClassLoader.preDefineClass(未知源)
位于java.lang.ClassLoader.DefineClassSecond(未知源)
位于java.lang.ClassLoader.defineClass(未知源)
位于java.security.SecureClassLoader.defineClass(未知源)
位于sun.plugin2.applet.Applet2ClassLoader.findClass(未知源)
位于sun.plugin2.applet.Plugin2ClassLoader.loadClass0(未知源)
位于sun.plugin2.applet.Plugin2ClassLoader.loadClass(未知源)
位于sun.plugin2.applet.Plugin2ClassLoader.loadClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(未知源)
位于org.codehaus.jackson.map.deser.BasicDeserializerFactory(BasicDeserializerFactory.java:74)
... 9更多
该行是以下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
}
试试看{
Class key=Class.forName(“java.util.ConcurrentNavigableMap”);
Class value=Class.forName(“java.util.ConcurrentSkipListMap”);
@抑制警告(“未选中”)
类>映射值=(类>)值;
_mapFallbacks.put(key.getName(),mapValue);
}catch(ClassNotFoundException cnfe){//发生在1.5上
}
有几件事我不明白:
- 为什么我的Java7 JVM不将其从运行库中取出?而是
- 为什么它试图从我的服务器下载
,这显然是因为/java/util/ConcurrentNavigableMap.class
失败了404
- 既然失败了,为什么它要连续快速地重新下载
25次,每次都成功(myapplet.jar
),每次都返回相同的jar文件200
CurrentNavigableMap
问题无关),因此我将从我的问题中排除这一点
注意:我猜它不会尝试重新下载jackson jar文件,因为该文件列在缓存\u存档
属性中。是这样吗
错误:Class.forName("java.util.ConcurrentNavigableMap");
正确:你确定你用的是java7吗?如果使用java.util.ConcurrentNavigableMap.Class而不是Class.forName(),会发生什么情况?根据我同时设置的java控制台,它与小程序一起启动:
1.7.0\u 07-b11 java HotSpot(TM)Client VM
使用自由浮动启动它。它每次都会得到一个新的VM,这可能会解决问题。然后将错误的详细信息报告给Oracle.Doh!我猜这是Jackson的一个bug-我会和那些家伙核实一下。刚刚向Jackson的家伙发送了一个请求:
Class.forName("java.util.concurrent.ConcurrentNavigableMap");