Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1313 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Rechercher les Class qui implémentent une Interface

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Rechercher les Class qui implémentent une Interface

n°1388799
brisssou
8-/
Posté le 16-06-2006 à 11:20:08  profilanswer
 

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
mood
Publicité
Posté le 16-06-2006 à 11:20:08  profilanswer
 

n°1388820
zapan666
Tout est relatif
Posté le 16-06-2006 à 11:31:25  profilanswer
 

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 !
n°1388845
brisssou
8-/
Posté le 16-06-2006 à 11:41:49  profilanswer
 

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
n°1388859
Bidem
Posté le 16-06-2006 à 11:47:06  profilanswer
 

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

n°1388880
brisssou
8-/
Posté le 16-06-2006 à 11:54:34  profilanswer
 

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
n°1389090
Bidem
Posté le 16-06-2006 à 15:03:48  profilanswer
 

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. }


 

n°1389220
brisssou
8-/
Posté le 16-06-2006 à 16:28:17  profilanswer
 

wow O_O


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1389267
the real m​oins moins
Posté le 16-06-2006 à 16:51:44  profilanswer
 

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 ?
n°1389270
the real m​oins moins
Posté le 16-06-2006 à 16:53:13  profilanswer
 

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 ?
n°1389273
brisssou
8-/
Posté le 16-06-2006 à 17:01:09  profilanswer
 

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
mood
Publicité
Posté le 16-06-2006 à 17:01:09  profilanswer
 

n°1389612
souk
Tourist
Posté le 17-06-2006 à 12:15:44  profilanswer
 

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

n°1389645
the real m​oins moins
Posté le 17-06-2006 à 14:23:37  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1389657
souk
Tourist
Posté le 17-06-2006 à 15:22:17  profilanswer
 

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

n°1389661
the real m​oins moins
Posté le 17-06-2006 à 15:26:41  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1389666
souk
Tourist
Posté le 17-06-2006 à 15:31:31  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Rechercher les Class qui implémentent une Interface

 

Sujets relatifs
[JavaScript] Rechercher dans une boite a listeInterface graphique et BDD
problème javabean. jsp à fichier class(liaison??)appleler une class statique par une variable ???
Rechercher dans une boite à listeInterface graphique
Redessiner l'interface graphiqueune interface comme atribut
rechercher, et faire quelquechose avec le fichier trouvé après...Compiler servlet en .class
Plus de sujets relatifs à : Rechercher les Class qui implémentent une Interface


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR