查找类以递归方式扩展或实现的所有类和接口 [英] find all classes and interfaces a class extends or implements recursively
问题描述
我想知道是否有一种简单的方法来确定Java类以递归方式扩展或实现的完整类型列表?
I was wondering if there was an easy way of determining the complete list of Types that a Java class extends or implements recursively?
例如:
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创建助手。
Think Arquillian ShrinkWrap creation helper.
UPDATE:由于Class对象未实现Comparable>我还需要找到一种创建Set(或类似类)的方法,而无需实现Comparable接口(例如,完全依赖于类对象的哈希码。)
UPDATE: due to the Class object not implementing Comparable> I also need to find a way of creating a Set (or similar class) without implementing the Comparable interface (for instance, solely relying on the hashcode of the class object).
UPDATE:将测试更改为使用hashset。 derp。
UPDATE: changed the test to use hashset. derp.
推荐答案
该方法的以下实现执行OP所需的操作,它遍历每个类和接口的继承层次结构:
The following implementation of the method does what the OP requires, it traverses the inheritance hierarchy for every class and interface:
public static Set<Class<?>> getAllExtendedOrImplementedTypesRecursively(Class<?> clazz) {
List<Class<?>> res = new ArrayList<>();
do {
res.add(clazz);
// First, add all the interfaces implemented by this class
Class<?>[] interfaces = clazz.getInterfaces();
if (interfaces.length > 0) {
res.addAll(Arrays.asList(interfaces));
for (Class<?> interfaze : interfaces) {
res.addAll(getAllExtendedOrImplementedTypesRecursively(interfaze));
}
}
// Add the super class
Class<?> superClass = clazz.getSuperclass();
// Interfaces does not have java,lang.Object as superclass, they have null, so break the cycle and return
if (superClass == null) {
break;
}
// Now inspect the superclass
clazz = superClass;
} while (!"java.lang.Object".equals(clazz.getCanonicalName()));
return new HashSet<Class<?>>(res);
}
我测试了 JFrame.class
我得到以下内容:
I tested with JFrame.class
and I got the following:
Set<Class<?>> classes = getAllExtendedOrImplementedTypesRecursively(JFrame.class);
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
输出:
java.awt.Container
java.awt.Frame
javax.swing.JFrame
javax.swing.TransferHandler$HasGetTransferHandler
java.awt.Window
javax.accessibility.Accessible
javax.swing.RootPaneContainer
java.awt.Component
javax.swing.WindowConstants
java.io.Serializable
java.awt.MenuContainer
java.awt.image.ImageObserver
更新:对于OP的测试用例,它会打印:
UPDATE: For the OP's test case it prints:
test.I5
test.Bar
test.I2
test.I1
test.Foo
test.I3
test.I4
这篇关于查找类以递归方式扩展或实现的所有类和接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!