E quale giorno migliore del mio ultimo di lavoro su Java per imbattermi in un baco da 10 e lode?
Praticamente stavamo provando a far girare la TestSuite di Jade su Java 6 (glassFish) e ci siamo scontrati su questo problema, come mostrato nel piccolo esempio qui sotto:
ClassLoader classLoader = ClassloaderTest.class.getClassLoader();
Class<?> className = classLoader.loadClass(“[Ljava.lang.Object;");
dove [Ljava.lang.Object; è la rappresentazione sotto forma di stringa di un array di Object, come restituito se si esegue questo codice:
new Object[0].getClass().getName();
La cosa bella è che il codice sovrastante funziona con Java 5 ma non con Java 6.
Googlando un pò ho scoperto che questo interessante articolo che spiega l’arcano.
Il nocciolo della questione è che il metodo ClassLoader.loadClass di Java 5 era più lasco di quello di Java 6 che invece implementa in maniera più restrittiva la Java Language Specification.
Infatti loadClass è definito per funzionare sui “binary names”, che la JLS definisce come classi e interfacce, ma non come array. Se si vuole far caricare al ClassLoader una classe s, e s potrebbe essere la rappresentazione sotto forma di stringa di un array, allora bisogna usare Class.forName(s, false, classLoader).
Mazi






