OVH Cloud OVH Cloud

Comment récupérer le tableau des classes d'un package ?

4 réponses
Avatar
JFA
Bonjour
Est-il possible de récupérer dans un tableau Class[] toutes les classes d'un
package dont on connaît le nom ?
Merci

4 réponses

Avatar
Emmanuel Feller
Bonjour,

Pas à ma connaissance.
Bon dimanche,
Emmanuel
"JFA" a écrit dans le message de
news:411f5b8d$0$26992$
Bonjour
Est-il possible de récupérer dans un tableau Class[] toutes les classes
d'un

package dont on connaît le nom ?
Merci





Avatar
Isammoc
Peut etre que si on connais le package, il y a moyen de récupérer les
fichiers *.class
donc, les classes publiques?

--
Isammoc

Juste une idée en l'air


"JFA" a écrit dans le message de
news:411f5b8d$0$26992$
Bonjour
Est-il possible de récupérer dans un tableau Class[] toutes les classes
d'un

package dont on connaît le nom ?
Merci





Avatar
Jean-Christophe Garnier

Bonjour
Est-il possible de récupérer dans un tableau Class[] toutes les classes d'un
package dont on connaît le nom ?
Merci





Bonjour,

Le code suivant le fait :
/*
* GetPackClass.java
*
* Created on 17 août 2004, 22:02
*/

package com.jcg.test;
import java.util.jar.*;
import java.util.*;
import java.io.*;

/**
*
* @author garnier
*/
public class GetPackClass
{

/** Creates a new instance of GetPackClass */
public GetPackClass (String packageName)
{
Vector classes = new Vector ();
try
{
JarInputStream jarFile = new JarInputStream (new
FileInputStream ("c:tempmy.jar"));
JarEntry jarEntry;

while(true)
{
jarEntry=jarFile.getNextJarEntry ();
if(jarEntry == null)
{
break;
}
System.out.println
("jarEntry.getName()="+jarEntry.getName ());
if((jarEntry.getName ().startsWith (packageName)) &&
(jarEntry.getName ().endsWith (".class")) )
{
System.out.println ("On ajoute");
classes.add (jarEntry.getName ());
}
}
System.out.println ("Taille du Vector="+classes.size ());
Class[] finalClasses = new Class[classes.size ()];
for (int i=0; i<classes.size ();i++)
{
try
{
System.out.println ("Classe trouvée:"+classes.get (i));
finalClasses[i] = Class.forName ((String)classes.get
(i));
}
catch(ClassNotFoundException e)
{
//La classe n'est pas trouvée si le jar n'est pas
chargée
// Dans ce cas, elle ne sera pas présente dans le
tableau de classes
}
}
}
catch( Exception e)
{
e.printStackTrace ();
}
}

/**
* @param args the command line arguments
*/
public static void main (String[] args)
{
System.out.println ("On recherche toutes les classes du package
"+args[0] +"(à donner sous la forme 'org/test/package')");
new GetPackClass (args[0]);
}

}

Avatar
Yves Martin
Jean-Christophe Garnier writes:

Bonjour,
Le code suivant le fait...


Il y a déjà eu ici un thread sur ce sujet pour la détection dynamique des
implémentations d'une interface.

Ton code fonctionne dans une situation très particulière (c'est toujours
cela):
- il faut que les classes soient dans un jar
- il faut connaître le moyen d'accéder au jar

Cela peut paraître suffisant mais c'est très limité par rapport aux
possibilités de Java:
- les classes peuvent être simplement dans un répertoire présent dans le
ClassPath.
- un ClassLoader peut charger ces classes depuis le réseau ou depuis un
stockage exotique qui n'est pas un jar.

Pour étendre ton outil, il faudrait analyser le Class-Path (à condition
qu'aucun ClassLoader ne soit ajouté de façon programmatique) et en fonction
des éléments présents, appliquer un système de recherche particulier.

Java 1.5 permet de nouvelles choses très intéressante (java.lang.instrument)
mais je n'ai pas encore trouvé ce mécanisme de recherche. Les méthodes que
j'ai trouvées ne font que retourner les classes déjà chargées pour les
instrumenter mais pas les classes disponibles dans le Class-Path.
A+
--
Yves Martin