Salut,
Depuis B et/ou C savoir que tu hérites de A c'est possible mais depuis A uniquement et sans jamais toucher à B et C, je ne vois pas comment tu peux savoir qui en hérite.
Par contre en listant les classes d'un packages tu peux connaitre qui hérite de qui:
Fichier A.java du package org.test
package org.test;
abstract class A { }
Fichier B.java du package org.test
package org.test;
public class B extends A{ }
Fichier C.java du package org.test
package org.test;
public class C extends A{ }
Fichier Reflect.java
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class Reflect {
public static void main(final String[] args) throws Exception{
Class<?>[] classes = getPackageClasses("org.test");
for(Class<?> c : classes) {
System.out.println(c);
System.out.println(" --> " + c.getSuperclass());
}
}
private static Class<?>[] getPackageClasses(final String packageName)
throws ClassNotFoundException, IOException {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final Enumeration<URL> resources = classLoader.getResources(packageName.replace('.', '/'));
final List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements())
dirs.add(new File(resources.nextElement().getFile()));
final ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
for (final File directory : dirs)
classes.addAll(findClasses(directory, packageName));
return classes.toArray(new Class<?>[classes.size()]);
}
private static List<Class<?>> findClasses(final File root,
final String packageName) throws ClassNotFoundException {
final List<Class<?>> classes = new ArrayList<Class<?>>();
if (!root.exists()) return classes;
for (final File file : root.listFiles()) {
if (file.isDirectory()) {
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (("" + file).endsWith(".class")) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
}
De là tu peux facilement déterminer la liste des enfants de A.
Tu peux également étendre le code pour connaitre la liste des classes qui sont chargées par le ClassLoader.
Modifié par Twinuts le 17/02/2015 à 11:49
voici la fonction
et le j'appelle dans main
il marche
Merci et bonne journée
EDIT-Twinuts: Ajout des balises code