ClassLoader.loadClass() e Java 6.

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

Advertisements

Last day with Java (for a while)…

Ed ecco giunto il mio ultimo giorno presso il nostro grande gestore di TLC sul progetto che mi ha visto coinvolto negli ultimi due anni.

Il bilancio è molto positivo: ho  lavorato in un grande team formato da persone motivate che hanno condiviso gli stessi valori e obiettivi, in cui la parte umana è stata essenziale per creare coesione e affiatamento.

Da lunedì mi si prospetta una nuova ed entusiasmante avventura, sempre presso lo stesso cliente come descrivevo nell’ultimo post.

Un grazie particolare a tutti quelli che mi hanno dato una mano a crescere professionalmente, anche se hanno dovuto più volte sorbirsi la mia testardaggine e il mio orgoglio ^_^.

Stay tuned.

Mazi