Java How To
 


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.