Kompatibilität
How To ...
Problembehebung beim dynamischen Laden von Klassen bei der Migration von Java 5 auf Java 6.
Hintergründe
Mit Java 6 wurde die Implementierung von ClassLoader.loadClass() geändert. Nach Glassfish Issue 714 ist das Verhalten zwar spezifikationskonform, führt jedoch bei bestimmten Glassfish-, Tomcat- und JBoss-AS-Versionen zu Fehlern.
So führt etwa der Code
public class ClassLoaderProblem {
public static void main(String[] args) throws Exception {
String[] s = new String[] { "123" };
String clName = s.getClass().getName();
ClassLoaderProblem.class.getClassLoader().loadClass(clName);
}
}
ausgeführt auf Java 5 zu keinen Problemen, während er auf Java 6 zur folgenden Exception führt:
Exception in thread "main" java.lang.ClassNotFoundException: [Ljava.lang.String;
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at de.javahowto.java6.compat.ClassLoaderProblem.main(ClassLoaderProblem.java:12)
So geht's
Abhilfe schafft die VM-Option -Dsun.lang.ClassLoader.allowArraySyntax=true. Die oben genannte Exception tritt dann nicht mehr auf.
