Получение суперинтерфейсов в Java - PullRequest
8 голосов
/ 27 марта 2012

Я пытался сделать это в течение достаточно долгого времени и не могу получить желаемый результат.

То, что я хочу сделать, это иметь имя класса, скажем java.util.Vector

получить:

  • непосредственно реализованные интерфейсы, если java.util.Vector.
  • интерфейсы, непосредственно реализованные суперклассами.
  • и, транзитивно, все суперинтерфейсы этих интерфейсов.

Буду признателен за любую помощь.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Вы можете сделать BFS , используя для этого отражение .

Начните с Set<Class<?>>, который содержит только Vector, и итеративно увеличивайте набор новыми элементами, используя Class.getInterfaces() и Class.getSuperclass()

Добавьте только что добавленные элементы в Queue [который необходим для запуска BFS]. Завершить, когда очередь пуста.

Постобработка: выполните итерацию Set - и возьмите только объекты, которые являются интерфейсами, использующими Class.isInterface()

Должно выглядеть примерно так:

Class<?> cl = Vector.class;
Queue<Class<?>> queue = new LinkedList<Class<?>>();
Set<Class<?>> types =new HashSet<Class<?>>();
queue.add(cl);
types.add(cl);
    //BFS:
while (queue.isEmpty() == false) {
    Class<?> curr = queue.poll();
    Class<?>[] supers = curr.getInterfaces();
    for (Class<?> next : supers) {
        if (next != null && types.contains(next) == false) {
            types.add(next);
            queue.add(next);
        }
    }
    Class<?> next = curr.getSuperclass();
    if (next != null && types.contains(next) == false) {
        queue.add(next);
        types.add(next);
    }
}
    //post processing:
for (Class<?> curr : types) { 
    if (curr.isInterface()) System.out.println(curr);
}
0 голосов
/ 27 марта 2012

Если вы открыты для использования другой библиотеки: используйте apache-commons-lang

0 голосов
/ 27 марта 2012

Хотя java.util.Vector не является интерфейсом, и поэтому вы не можете расширить его с помощью интерфейса, вы можете использовать такую ​​библиотеку, как Reflections , чтобы приспособить эти виды функций. Reflections позволяет сканировать путь к классам и запрашивать набор условий, например, что реализует или расширяет данный класс / интерфейс. Я успешно использовал его в нескольких проектах, где мне нужно было искать реализации интерфейса и аннотированные классы.

Вот явная ссылка: http://code.google.com/p/reflections/

Кроме того, если вы хотите узнать, какой класс / интерфейс расширяет / реализует класс, вы можете просто использовать api отражения класса через атрибут класса.

Вот несколько примеров:

//get all public methods of Vector
Vector.class.getMethods();
//get all methods of the superclass (AbstractList) of Vector
Vector.class.getSuperclass().getMethods();
//get all interfaces implemented by Vector
Vector.class.getInterfaces();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...