IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Supprimer une class loadée dynamiquement ?


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Points : 24
    Points
    24
    Par défaut Supprimer une class loadée dynamiquement ?
    Bonjour,

    Dans mon programme, je charge des class dynamiquement (des classes qui ne sont pas dans le classpath)

    Je les ais rassemblées dans un ArrayList.

    Cependant je n'arrive pas à supprimer l'une d'elle. En effet, la class est utiliser donc le fichier ne peux être supprimer.

    J'ai essayer de supprimer la ligne de ma class dans mon ArrayList puis de faire un garbage collector, mais c'est ça ne veux toujours pas la supprimer.

    Quelqu'un as une idée de comment faire pour supprimer une class chargée dynamiquement ?

    PS : j'ai suivit ce tuto pour charger mes class : http://vincentlaine.developpez.com/t.../java/plugins/

    Voici le code du chargement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
            URLClassLoader loader;
            String tmp;
            Class tmpClass;
     
     
            File path=new File(USER_DIR+"scripts/");
            File[] children = path.listFiles();
            //Pour chaque fichier du repertoire des scripts
            for(int j=0;j<children.length;j++){
     
                //Si c'est un fichier jar
                if(children[j].toString().endsWith(".jar")){
                    try{
     
                        //On créer un nouveau URLClassLoader pour charger le jar qui se trouve ne dehors du CLASSPATH
                        loader = new URLClassLoader(new URL[] {children[j].toURI().toURL()}); 
                        //On charge le jar en mémoire
                        JarFile jar = new JarFile(children[j].getAbsolutePath());
     
     
                        Enumeration e = jar.entries();
                        //Pour chaque fichier du jar
                        while(e.hasMoreElements()){
     
    				tmp = e.nextElement().toString();
     
     
    				//On vérifie que le fichier courant est un Main.class 
    				if(tmp.endsWith("Main.class")) {
     
    					tmp = tmp.substring(0,tmp.length()-6);
    					tmp = tmp.replaceAll("/",".");
     
     
    					tmpClass = Class.forName(tmp ,true,loader);
     
                                            myArrayList.add((MyInterface)tmpClass.newInstance());
     
     
     
    				}
    			}
     
                    }catch(Exception ex){ex.printStackTrace();}
                }
            }

    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    myArrayList.remove(k);
     
    Runtime r = Runtime.getRuntime();
    r.gc();
    File myFile=new File(gui_accueil.DTEK_USER_DIR+"scripts/"+name);
     
    myFile.delete()
    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Points : 445
    Points
    445
    Par défaut
    Il te faut donc "décharger" ta classe, et la seule façon est de détruire le classloader qui a permis de la charger. Mais même comme ça je ne suis pas sûr que tu puisses supprimer le fichier .class immédiatement, car il faut probablement attendre que le garbadge collector ait supprimé le classloader

    Jacques Desmazieres

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Merci pour ta réponse, mais je ne vois pas très bien comment détruire mon class loader...
    En effet, après le chargement de mes class, je n'ais plus accés à mes loader, vu que à chaque chargement de class, mon loader est remplacé par un autre loader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    loader = new URLClassLoader(new URL[] {children[j].toURI().toURL()});
    Il faudrais aussi que j'attende que le gc soit finis pour supprimer ma class, puisque je suppose que le gc est lancé dans un thread nativement.

Discussions similaires

  1. Modifier/supprimer une classe ou d'une fonction
    Par ProgVal dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2009, 11h05
  2. Accès aux objets d'une classe créés dynamiquement
    Par mulfycrowh dans le forum Débuter
    Réponses: 5
    Dernier message: 17/10/2009, 23h03
  3. [API Reflection] Supprimer une classe du cache
    Par aurelienDC dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 13/04/2009, 19h25
  4. Supprimer une classe Fille sans toucher a la Mere
    Par 17mounir dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/01/2007, 12h27
  5. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo