/** * * @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]); }
}
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
*/
/**
*
* @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:\temp\my.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]);
}
/** * * @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]); }
}
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
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
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