Мне было интересно, существует ли простой способ определения полного списка типов, который класс Java расширяет или реализует рекурсивно?
например:
class Foo extends Bar implements I1, I2 {...}
class Bar implements I3 {...}
interface I1 extends I4, I5 {...}
interface I2 {...}
interface I3 {...}
interface I4 {...}
interface I5 {...}
class ClassUtil {
public static Set<Class<?>> getAllExtendedOrImplementedTypesRecursively(Class<?> clazz){
???
}
}
import static org.junit.Assert.*;
public class ClassUtilTest {
@Test
public void shouldEqualClasses(){
Set<Class<?>> types = ClassUtil.getAllExtendedOrImplementedTypesRecursively(Foo.class);
Set<Class<?>> checklist = new HashSet<>();
checklist.add(Foo.class);
checklist.add(Bar.class);
checklist.add(I1.class);
checklist.add(I2.class);
checklist.add(I3.class);
checklist.add(I4.class);
checklist.add(I5.class);
assertTrue(checklist.containsAll(types));
assertTrue(types.containsAll(checklist));
}
}
Вспомните помощника по созданию Arquillian ShrinkWrap.
UPDATE: из-за объекта класса, не реализующего Comparable > Мне также нужно найти способ создания Set (или подобного класса) без реализации интерфейса Comparable (например, исключительно полагаясь на hashcode объекта класса).
UPDATE: изменил тест на использование hashset. Derp.