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

Java Discussion :

Récupérer la liste des classes d'un package


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut Récupérer la liste des classes d'un package
    Est il possible de récupérer le liste des classes d'un package de façon dynamique ?

    Plus précisemment :

    je récupère le nom d'un package sous forme de String et j'aimerais pouvoir récupérer la liste des classes de ce package se trouvant dans le classloader.

    Si c'est possible, pouvez vous m'indiquer comment ?

    Merci par avance,

    Arnaud

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je crois que ce n'est pas possible ; il me semble que cette question a déjà était posée sur le forum est que c'était ce qui en ressortait.
    A confirmer (fait une recherche sur le forum tu trouveras surement le poste en question ) ...
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    C'est tout à fait possible, il faut utiliser l'API reflection de Java. C'est d'ailleurs cette API qui permet a la JVM de sortir la trace lors de levée d'exception par exemple.
    Il y a un tutoriel sur le site developpez.com sur le sujet qui pourra te donner des éléments de réponse : http://ricky81.developpez.com/tutori...pi/reflection/

    Sinon il y a la javadoc sur cette API. Mais bon un tuto c'est toujours un peu plus simple. Il doit toujours avoir des tuto directement chez sun.

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par JFortranDoc
    C'est tout à fait possible, il faut utiliser l'API reflection de Java. C'est d'ailleurs cette API qui permet a la JVM de sortir la trace lors de levée d'exception par exemple.
    Il y a un tutoriel sur le site developpez.com sur le sujet qui pourra te donner des éléments de réponse : http://ricky81.developpez.com/tutori...pi/reflection/

    Sinon il y a la javadoc sur cette API. Mais bon un tuto c'est toujours un peu plus simple. Il doit toujours avoir des tuto directement chez sun.
    L'API de reflection est un outil très puissant mais il me semble que tu auras du mal à lister les classes d'un package avec, par exemple la classe Package, de l'API de reflection, ne propose aucune méthode te permettant de lister les classes du dit package.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    A la limite,
    • Si tu as les sources tu peus lister les .java présent dans le package qui t'intéresse.
    • Si tu sais dans quel jar ton package se trouve tu peus le lire via les classes JarFile et JarEntry, et lister les .class (du package voulu) contenues dedans.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Je sais quel est mon Jar mais je ne sais pas comment aller le lire via JarFile.

    Mon Jar se trouve dans mon war (sous Jonas). Quel chemin dois je utiliser pour lire ce jar ?

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Par défaut Une solution... plus complète
    Bon à force de chercher, j'ai finis par bidouiller un bout de code qui fonctionne. Il pallie les manques du code fournis plus haut en recherchant aussi les classes d'un package à l'intérieur d'un jar. Bon je met le code, je pense avoir assez bien commenté.

    J'espère avoir été utile pour mon premier post sur ce forum...

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    /**
     * Cette méthode permet de lister toutes les classes d'un package donné
     * 
     * @param pckgname Le nom du package à lister
     * @return La liste des classes
     */
    public List<Class> getClasses(String pckgname)	throws ClassNotFoundException, IOException {
    	// Création de la liste qui sera retournée
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	// On récupère toutes les entrées du CLASSPATH
    	String [] entries = System.getProperty("java.class.path")
    					.split(System.getProperty("path.separator"));
     
    	// Pour toutes ces entrées, on verifie si elles contiennent
    	// un répertoire ou un jar
    	for (int i = 0; i < entries.length; i++) {
     
    		if(entries[i].endsWith(".jar")){
    			classes.addAll(traitementJar(entries[i], pckgname));
    		}else{
    			classes.addAll(traitementRepertoire(entries[i], pckgname));
    		}
     
    	}
     
    	return classes;
    }
     
    /**
     * Cette méthode retourne la liste des classes présentes
     * dans un répertoire du classpath et dans un package donné
     * 
     * @param repertoire Le répertoire où chercher les classes
     * @param pckgname Le nom du package
     * @return La liste des classes
     */
    private Collection<Class> traitementRepertoire(String repertoire, String pckgname) throws ClassNotFoundException {
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	// On génère le chemin absolu du package
    	StringBuffer sb = new StringBuffer(repertoire);
    	String[] repsPkg = pckgname.split("\\.");
    	for (int i = 0; i < repsPkg.length; i++) {
    		sb.append(System.getProperty("file.separator") + repsPkg[i]);
    	}
    	File rep = new File(sb.toString());
     
    	// Si le chemin existe, et que c'est un dossier, alors, on le liste
    	if(rep.exists() && rep.isDirectory()){
    		// On filtre les entrées du répertoire
    		FilenameFilter filter = new DotClassFilter();
    		File[] liste = rep.listFiles(filter );
     
    		// Pour chaque classe présente dans le package, on l'ajoute à la liste
    		for (int i = 0; i < liste.length; i++) {
    			classes.add(Class.forName(pckgname + "." + liste[i].getName().split("\\.")[0]));
    		}
    	}
     
    	return classes;
    }
     
    /**
     * Cette méthode retourne la liste des classes présentes dans un jar du classpath et dans un package donné
     *
     * @param repertoire Le jar où chercher les classes
     * @param pckgname Le nom du package
     * @return La liste des classes
     * @throws IOException 
     * @throws ClassNotFoundException 
     */
    private Collection<Class> traitementJar(String jar, String pckgname) throws IOException, ClassNotFoundException {
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	JarFile jfile = new JarFile(jar);
    	String pkgpath = pckgname.replace(".", "/");
     
     
    	// Pour chaque entrée du Jar
    	for (Enumeration<JarEntry> entries = jfile.entries(); entries.hasMoreElements();) {
    		JarEntry element = entries.nextElement();
     
    		// Si le nom de l'entrée commence par le chemin du package et finit par .class
    		if(element.getName().startsWith(pkgpath)
    			&& element.getName().endsWith(".class")){
     
    			String nomFichier = element.getName().substring(pckgname.length() + 1);
     
    			classes.add(Class.forName(pckgname + "." + nomFichier.split("\\.")[0]));
     
    		}
     
    	}
     
    	return classes;
    }
     
    /**
     * Cette classe permet de filtrer les fichiers d'un répertoire. Il n'accepte que les fichiers .class.
     */
    private class DotClassFilter implements FilenameFilter{
     
    	public boolean accept(File arg0, String arg1) {
    		return arg1.endsWith(".class");
    	}
     
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2008, 11h11
  2. Liste des classes d'un package d'un PlugIn
    Par SpIrIt505050 dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2007, 15h45
  3. lire la liste des classes d'un package sous Websphere
    Par Coulon Arnaud dans le forum Websphere
    Réponses: 4
    Dernier message: 21/05/2007, 09h22
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  5. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42

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