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