2010-04-23 4 views
4

Je dois implémenter une logique selon laquelle, étant donné une classe enfant, j'ai besoin d'accéder à sa classe parente et à toutes les autres classes enfants de cette classe parente, le cas échéant. Je n'ai trouvé aucune API dans Java Reflection qui nous permet d'accéder à toutes les classes enfants d'une classe parente. Y a-t-il un moyen de le faire?Accès à toutes les classes enfants de la classe parente en Java

Par exemple:

class B extends class A 
class C extends class A 

Maintenant, en utilisant la classe B, je peux trouver la superclasse en appelant getSuperClass(). Mais y a-t-il un moyen de trouver toutes les classes enfant une fois que j'ai la classe parente, c'est-à-dire la classe B et la classe C ??

+2

Étiez-vous en train de définir ce problème spécifique comme devoir, ou avez-vous défini un problème différent, et celui-ci est apparu dans le cadre de votre implémentation de la solution? Je demande, car une autre solution pourrait être d'adopter une approche différente de votre problème. –

+0

@Stephen: c'est l'une des exigences du devoir et n'est liée à aucune autre exigence/problème. –

Répondre

11

Si ce n'était pas des devoirs (où les librairies tierces ne sont probablement pas autorisées), j'aurais suggéré Google Reflections 'Reflections#getSubTypesOf().

Set<Class<? extends A>> subTypes = reflections.getSubTypesOf(A.class); 

Vous pouvez le faire moins ou plus vous en balayant le classpath vous, en commençant par ClassLoader#getResources() où vous passez "" comme nom.

5

Vous avez raison: il n'y a pas d'API directe pour cela. Je suppose que vous pouvez analyser toutes les classes chargées et voir si elles sont une sous-classe d'une classe donnée.

Un problème: vous ne pourrez trouver que des classes déjà chargées. Aucune de ces méthodes ne trouvera les classes qui n'ont pas encore été chargées.

-1

Vous pouvez utiliser:

thisObj.getClass().getSuperclass() 
thisObj.getClass().getInterfaces() 
thisObj.getClass().getGenericInterfaces() 
thisObj.getClass().getGenericSuperclass() 

I quelque chose récemment codé pour scanner les membres d'une classe et si ceux étaient des non-primitives scanner ceux aussi bien. Cependant, je n'ai pas remonté vers le haut, donc je n'ai pas utilisé les méthodes ci-dessus mais je crois qu'ils devraient faire ce que vous voulez.

EDIT: Je couru un test simple avec les éléments suivants:

public class CheckMe { 
    public CheckMe() { 
    } 
} 

public class CheckMeToo extends CheckMe { 
    public CheckMeToo() { 
    } 
} 
// In main 
System.out.println(CheckMeToo.class.getSuperclass()); 

// Output 
class CheckMe 

Après cela, il est une question de codage du traversal. Si c'est paramétré alors les choses peuvent devenir un peu compliquées mais tout à fait faisable.

EDIT: Désolé n'a pas lu attentivement, laissez-moi regarder plus loin.

EDIT: Il ne semble pas y avoir moyen de le faire sans tout scanner dans votre CLASSPATH et en vérifiant qu'un objet est une instance d'une classe.

Questions connexes