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

Langage Java Discussion :

Lister toutes les sous-classes d'un classe mère


Sujet :

Langage Java

  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut Lister toutes les sous-classes d'un classe mère
    Salut,

    Pour les besoins d'un logiciel, je voudrais savoir si c'était possible d'obtenir une liste de toutes les sous-classes d'une classe.

    J'ai une classe mère Classifier et une multitude de sous-classes. J'aimerai obtenir ses enfants. Est-ce possible ?

    J'ai vu partout que pour la liste des méthodes, composantes d'une classe c'était possible mais je n'ai trouvé nulle part pour un classe et ses sous-classes

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,

    voici du code que j'avais developpe pour les besoins d'une application web, mais faudrait certainement le modifier si tu as besoin de regarder a l'interieur de jar.

    le point d'entree est la methode searchAssignableFrom(...)

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    package com.praesentiae.tools;
     
    import java.io.File;
    import java.lang.reflect.Field;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
     
    public final class ClassTools
    	{
    	static private final Comparator<Class<?>>	sortClassByClassName	= new Comparator<Class<?>>() {
    																							public int compare(Class<?> class1, Class<?> class2)
    																								{
    																								return ((Class<?>) class1).getName().compareTo(((Class<?>) class2).getName());
    																								}
     
    																						};
     
    	static public boolean areTheSame(Object obj1, Object obj2)
    		{
    		if (obj1 == null)
    			return (obj2 == null);
    		if (obj2 == null)
    			return false;
     
    		return getClassName(obj1).equals(getClassName(obj2));
    		}
     
    	static public String getClassName(Class<?> classname)
    		{
    		if (classname == null)
    			return "null";
     
    		String str = classname.getName();
    		return str.substring(str.lastIndexOf(".") + 1);
    		}
     
    	static public String getClassName(Object obj)
    		{
    		return (obj == null ? "null" : getClassName(obj.getClass()));
    		}
     
    	static public <T> List<Class<T>> searchAssignableFrom(Class<T> refClass)
    		{
    		URL url = (new ClassTools()).getClass().getResource("/");
     
    		List<Class<T>> classes = new ArrayList<Class<T>>(100);
    		recurseClassFinder("", classes, new File(url.getFile()));
    		for (int idx = classes.size() - 1; idx >= 0; idx--)
    			{
    			Class<T> theClass = classes.get(idx);
    			if (!refClass.isAssignableFrom(theClass))
    				classes.remove(idx);
    			}
     
    		Collections.sort(classes, sortClassByClassName);
     
    		return classes;
    		}
     
    	static public <T> List<T> searchFieldsByType(Class<?> classToSearch, Class<T> fieldToSearch) throws IllegalArgumentException, IllegalAccessException
    		{
    		List<T> list = new ArrayList<T>(20);
    		Field[] fields = classToSearch.getDeclaredFields();
    		Field field;
    		for (int idx = fields.length - 1; idx >= 0; idx--)
    			{
    			field = fields[idx];
    			if (fieldToSearch.isAssignableFrom(field.getType()))
    				{
    				field.setAccessible(true);
    				list.add((T) field.get(null));
    				}
    			}
    		return list;
    		}
     
    	static public <T> List<T> searchFieldsByType(Class<?> classToSearch, Class<T>[] fieldToSearch) throws IllegalArgumentException, IllegalAccessException
    		{
    		List<T> list = new ArrayList<T>(20);
    		for (int idx = 0; idx < fieldToSearch.length; idx++)
    			{
    			List<T> l = searchFieldsByType(classToSearch, fieldToSearch[idx]);
    			if (l != null && l.size() > 0)
    				list.addAll(l);
    			}
    		return list;
    		}
     
    	static private void recurseClassFinder(String prevPackageName, List classes, File directory)
    		{
    		File[] files = directory.listFiles();
    		String nextPackageNamePrefix = (StringTools.isEmpty(prevPackageName) ? "" : prevPackageName.trim() + ".");
    		for (int idx = files.length - 1; idx >= 0; idx--)
    			{
    			if (files[idx].isDirectory())
    				{
    				recurseClassFinder(nextPackageNamePrefix + files[idx].getName(), classes, files[idx]);
    				}
    			else if (files[idx].getName().toLowerCase().endsWith(".class"))
    				{
    				String filename = files[idx].getName();
    				try
    					{
    					Class theclass = Class.forName(nextPackageNamePrefix + filename.substring(0, filename.length() - 6));
    					classes.add(theclass);
    					}
    				catch (Exception ex)
    					{
     
    					}
     
    				}
    			}
     
    		}
    	}
    ---
    Farid

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    pour ce code

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Pas de soucis.
    ---
    Farid

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Salut,

    Par hasard, pourquoi veux-tu faire cela ? Quand on voit ce besoin là, c'est parfois (pas toujours) un problème de conception.
    Je ne répondrai à aucune question technique en privé

  6. #6
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    C'est simple j'ai un projet .jar qui contient un ensemble de classe.
    Je veux pouvoir les lister dans une JComboBox pour les utiliser plus tard...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut Kerod,

    Tu as pu utiliser le code tel quel pour travailler dans le jar ou est ce qu'il a fallu que tu le modifies ?

    ---
    Farid

  8. #8
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    J'ai surtout abandonné l'idée de le faire

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    lol
    dure a ce point, ou juste plus besoin de le faire ?

    ---
    Farid

  10. #10
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben c'est surtout que dans le cahier des charges ce n'était pas demandé. C'est juste moi qui voulait améliorer les choses pour que ce soit plus dynamique

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    ok

    ---
    Farid

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

Discussions similaires

  1. Comment lister toutes les classes annotées ?
    Par verbose dans le forum Général Java
    Réponses: 16
    Dernier message: 03/05/2011, 00h38
  2. Lister toutes les classes filles
    Par Loceka dans le forum Général Java
    Réponses: 3
    Dernier message: 01/04/2010, 11h46
  3. Réponses: 10
    Dernier message: 10/12/2006, 16h26
  4. [D7][Infos système] Comment lister toutes les classes WMI ?
    Par phplive dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2006, 23h51

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