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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: