Re: [classique: tuer une classe]

Rémi Forax <[email protected]> Sat, 18 Jun 2011 20:12:09 +0200
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>
On 06/18/2011 07:05 PM, Dupont Alex wrote:
>
> Bonsoir,
>
> Question farfelue:
> - Comment peut-on tuer une classe?
>
> Merci
>
> Al

On tue son classloader (si on on a chargé la classe avec un classloader 
perso,
sinon on peut pas) et on s'assure qu'il n'y a plus d'objet
de cette classe qui traine.

Pour utiliser son classloader perso il faut hériter de java.lang.ClassLoader
et redéfinir findClass() (pas loadClass() sous peine de trouble mental 
du genre
ClassCastException entre j.l.String et j.l.String [1])
ou utiliser un URLClassLoader [2] mais dans ce cas la classe ne doit pas 
être
disponible à partir du classpath seulement en utilisant l'URL indiqué.

Que cela soit avec ton propre classloader ou un URLClassLoader,
il doit être créeé avec en paramètre le ClassLoader de l'application 
(celui-qui
charge le Main) que l'on obtient facilement comme ceci:
   Main.class.getClassLoader()
Dans le cas contraire, il est possible d'avoir des messages d'erreur du 
genre,
je ne trouve pas j.l.Object.

De façon général, c'est assez fun de jouer avec les classloaders mais
faut bien avoir lu la doc sinon cela peut rapidement devenir prise de tête.
Enfin, dans un environement genre JEE ou Spring, le container a déjà
tendance à jouer avec les classloaders donc si ton appli fait de même
prépare une boite d'aspirine d'avance.

Rémi
[1] 
http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#findClass%28java.lang.String%29
[2] 
http://download.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html