该方法的以下实现会执行OP所需的操作,它遍历每个类和接口的继承层次结构:
public static Set> getAllExtendedOrImplementedTypesRecursively(Class> clazz) {
List> 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>(res);
}
我用JFrame.class进行了测试,我得到以下内容:
Set> 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的测试案例,它打印:
test.I5
test.Bar
test.I2
test.I1
test.Foo
test.I3
test.I4