Rechercher les Class qui implémentent une Interface

Rechercher les Class qui implémentent une Interface - Java - Programmation

Marsh Posté le 16-06-2006 à 11:20:08    

est-ce que c'est possible de rechercher dans le classpath les classes qui implémentent une interface ? dans le même style que la recherche dans Eclipse.
 
En fait, c'est pour mettre ça dans une appli web de configuration d'un outil d'ordonnancement. Du coup, pour ordonnancer les taches, il faut les trouver. Sachant que les taches implémentent toutes une interface, etc etc...
 
Je cherche donc un système (léger si possible)...
 
J'ai pas l'impréssion que le système de Eclipse soit externalisable, et mes recherches sur le net n'ont rien donné.
 
 
Merci


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 16-06-2006 à 11:20:08   

Reply

Marsh Posté le 16-06-2006 à 11:31:25    

Tes taches, ce sont des objets non ?
Bah tu les parcours et si ce sont des objets qui implemente ton interface, rulez (en fait je vois pas le probleme...)
 
genre

Code :
  1. if (MonObj instanceof MonInterface)


 
Bon, apres, il y a surement mieux...


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 16-06-2006 à 11:41:49    

j'ai peur que parcourrir tout le classpath soit un rien lourd...
 
Je connais pas leur nom a priori.
 
Pour l'instant, c'est ce que je fait, quand l'utilisateur fournir un nom de classe entièrement qualifié, je vérifie que c'est une classe, qu'elle implémente l'interface qui va bien, et qu'elle est instanciable. Mais c'est un peu foireux je trouve, ça implique que l'utilisateur connait le nom de la classe au caractère près.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 16-06-2006 à 11:47:06    

Eclise doit se baser sur une recherche dans les fichier java pour faire ça donc ce n'est pas applicable à ton cas.
 
Je ne crois pas que ce soit possible de lister les classes disponibles dans le classpath
 
Ce que tu peux faire, c'est passer par un parametre dans un fichier de conf qui te donnerait une liste de classe à charger

Reply

Marsh Posté le 16-06-2006 à 11:54:34    

c'est bien qu'est-ce que je pensais... bon, ben dans mon cul alors


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 16-06-2006 à 15:03:48    

En fait, c'est possible ;)
 
Je me suis un peu creusé la tête et voila le résultat
 

Code :
  1. package fr.bidem;
  2. import java.io.File;
  3. import java.util.List;
  4. import java.util.Stack;
  5. import java.util.StringTokenizer;
  6. public class TestClassLoader {
  7.   /**
  8.    * Récupération de la classe à partir du fichier .class et du répertoire
  9.    * contenant ce fichier.<br />
  10.    * Exemple :<br />
  11.    * si fichierClasse est D:\mesClasses\fr\toto\MaClasse.class
  12.    * et si baseClasspath est D:\mesClasses
  13.    * le résultat sera la classe fr.toto.MaClasse
  14.    *  
  15.    * @param fichierClasse fichier .class
  16.    * @param baseClasspath répertoire faisant partie du classpath et contenant
  17.    *        fichierClasse
  18.    * @return classe du fichier
  19.    */
  20.   private static Class toClass(File fichierClasse, File baseClasspath) throws ClassNotFoundException {
  21.     String nomFichier = fichierClasse.getAbsolutePath();
  22.     int debut = baseClasspath.getAbsolutePath().length() + 1;
  23.     int fin = nomFichier.lastIndexOf(".class" );
  24.     String regexp;
  25.     if (File.separatorChar == '\\') {
  26.       /* sous windows :
  27.        *   le séparateur de fichier c'est \
  28.        *   l'expression régulière pour ça c'est \\ (déspécialisation du \)
  29.        *   la String pour créer cette expression régulière c'est "\\\\"
  30.        *      c'est une chaine de longueur 2 (2 fois le caractère '\')
  31.        * ...
  32.        */
  33.       regexp = "\\\\";
  34.     } else {
  35.       /* en général le séparateur de fichier, c'est / (unix, linux, ...)
  36.        */
  37.       regexp = File.separator;
  38.     }
  39.     // remplacement des / ou \ par .
  40.     String nomClasse = nomFichier.substring(debut, fin).replaceAll(regexp, "." );
  41.     return ClassLoader.getSystemClassLoader().loadClass(nomClasse);
  42.   }
  43.   /**
  44.    * @param args
  45.    */
  46.   public static void main(String[] args) {
  47.     // récupértation du CLASSPATH
  48.     String classpath = System.getProperty("java.class.path" );
  49.     System.out.println(classpath);
  50.     System.out.println("------------------------------" );
  51.    
  52.     // Découpage du classparh
  53.     StringTokenizer chemins = new StringTokenizer(classpath, System.getProperty("path.separator" ));
  54.     while (chemins.hasMoreTokens()) {
  55.       String chemin = chemins.nextToken();
  56.       File elementClasspath = new File(chemin);
  57.       if (elementClasspath.isDirectory()) {
  58.         // on ne s'occupe que des répertoire, on laisse les jars de côté
  59.         System.out.println(chemin);
  60.         File courrant = elementClasspath; // prochain élément à tester
  61.         Stack aTester = new Stack(); // pile contenant les éléments à tester
  62.                                      // après courrant
  63.         while (courrant != null) {
  64.          
  65.           String nomCourrant = courrant.getName();
  66.           if (courrant.isDirectory()) {
  67.             // on ajoute tous les éléments de courrant dans la pile
  68.             File[] aAjouter = courrant.listFiles();
  69.             for (int i = aAjouter.length - 1; i >= 0 ; i--) {
  70.               aTester.push(aAjouter[i]);
  71.             }
  72.           } else if (nomCourrant.endsWith(".class" )) {
  73.             // On a trouvé une classe, c'est ici qu'il faut faire les
  74.             // traitements
  75.            
  76.             try {
  77.               // récupération de la classe associée
  78.               Class classe = toClass(courrant, elementClasspath);
  79.               // lancement des traitements sur la classe
  80.               // ex : on vérifie si la étend l'interface java.util.List
  81.               if (List.class.isAssignableFrom(classe)) {
  82.                 System.out.println("*** La classe " + classe.getName() + " étend java.util.List !" );
  83.               }
  84.             } catch (ClassNotFoundException e) {
  85.               e.printStackTrace();
  86.             }
  87.            
  88.           }
  89.           // passage au fichier suivant
  90.           if (aTester.isEmpty()) {
  91.             courrant = null;
  92.           } else {
  93.             courrant = (File) aTester.pop();
  94.           }
  95.         }
  96.       }
  97.     }
  98.   }
  99. }


 

Reply

Marsh Posté le 16-06-2006 à 16:28:17    

wow O_O


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 16-06-2006 à 16:51:44    

bah, ça ne marche que si t'as un fichier sur le filesystem qui correspond à ta classe, ET tu forces ta vm à loader toutes ces classes, ce qui n'est pas necessairement désirable.. (meme si dans le cas d'une web-app, et dans le cas ou tes classes sont dans WEB-INF/classes, elles seront plus que probablement toutes loadées)
 
... un moyen bien plus simple et leger, c'est d'utiliser un mechanisme avec un fichier descripteur, style simple fichier properties. tu peux dès lors avoir tes implementations dans des jars ou n'importe ou. genre classloader.getResourceURLs("META-INF/supertruc.properties" ) pour récuperer tous les "supertruc.properties" accessible à ton classloader, et hop.
 
évidemment, c'est un mini poil plus chiant pour l'implementeur qui doit faire ce descripteur ... mais bcp plus portable et pérenne


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-06-2006 à 16:53:13    

nb: y'a déjà eu qques topics similaires ou il pourrait y'avoir des infos interessantes..


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-06-2006 à 17:01:09    

j'ai pas trouvé les bons critères de recherches pour tomber sur les topics...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 16-06-2006 à 17:01:09   

Reply

Marsh Posté le 17-06-2006 à 12:15:44    

et avec des annotations et un petit coup d'apt, ca passerait pas ?

Reply

Marsh Posté le 17-06-2006 à 14:23:37    

et apt il va taper dans ton classpath runtime? [:joce]
 
ou bien Puzzles, ptet? :whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-06-2006 à 15:22:17    

ah ? apt c'est au compile time ?  
(puzzles hum ... vivement que j'ai du temps de m'occuper de cetruc tiens :/ pfff )

Reply

Marsh Posté le 17-06-2006 à 15:26:41    

je croyais?
enfin, build-time en tous cas?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-06-2006 à 15:31:31    

c'est possible, j'ai jamais regarde serieusement [:joce]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed