Доступ к каждому дочернему классу родительского класса в Java - PullRequest
5 голосов
/ 23 апреля 2010

Мне нужно реализовать логику, согласно которой для данного дочернего класса мне нужно получить доступ к его родительскому классу и ко всем другим дочерним классам этого родительского класса, если таковые имеются.Я не нашел API в Java Reflection, который позволил бы нам получить доступ ко всем дочерним классам родительского класса.Есть ли способ сделать это?

Например:

class B extends class A
class C extends class A

Теперь, используя класс B, я могу найти суперкласс, вызвав getSuperClass().Но есть ли способ найти все дочерние классы, если у меня есть родительский класс, то есть класс B и класс C ??

Ответы [ 3 ]

12 голосов
/ 23 апреля 2010

Если бы это была не домашняя работа (где сторонние библиотеки, вероятно, не разрешены), я бы предложил Google Reflections 'Reflections#getSubTypesOf().

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

Вы можете сделать это меньше или больше самостоятельно, отсканировав путь к классу самостоятельно, начиная с ClassLoader#getResources(), в котором вы передаете "" как имя.

5 голосов
/ 23 апреля 2010

Вы правы: для этого нет прямого API. Я предполагаю, что вы могли бы отсканировать все загруженные классы и посмотреть, являются ли они подклассом данного класса.

Одна проблема: вы сможете найти только классы, которые уже загружены. Ни один из этих методов не найдет классы, которые еще не были загружены.

0 голосов
/ 23 апреля 2010

Вы можете использовать:

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

Я недавно что-то кодировал, чтобы сканировать членов класса, и если они были не примитивными, то сканировал и их. Однако я не двигался вверх, поэтому я не использовал вышеуказанные методы, но я считаю, что они должны делать то, что вы хотите.

EDIT: Я провел простой тест со следующим:

public class CheckMe {
  public CheckMe() {
  }
}

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

// Output
class CheckMe

После этого вопрос кодирования обхода. Если его параметризовать, то все может стать немного сложнее, но все же вполне выполнимо.

РЕДАКТИРОВАТЬ: Извините, что не читал внимательно, позвольте мне изучить его подробнее.

РЕДАКТИРОВАТЬ: Кажется, нет никакого способа сделать это без сканирования всего в вашем CLASSPATH и проверки, чтобы убедиться, что объект является экземпляром некоторого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...