根据当前class获取所有的父类(接口)
近期在看EventBus的源码,看到这段根据当前class获取所有的superclass和接口的代码片段,现在就把这段代码,提取出来,与小伙伴们共享,也为了以后可能使用到,留个标记
果然看源码,好处多多,受益多多,啊哈哈~~~~
static Map<Class<?>,List<Class<?>>> eventTypesCache = new HashMap<Class<?>,List<Class<?>>>();
private static List<Class<?>> lookupAllEventTypes(Class<?> eventClass) {
List<Class<?>> eventTypes = eventTypesCache.get(eventClass);
if (eventTypes == null) {
eventTypes = new ArrayList<>();
Class<?> clazz = eventClass;
while (clazz != null) {
//获取所有父类和接口的集合
eventTypes.add(clazz);
addInterfaces(eventTypes, clazz.getInterfaces());
clazz = clazz.getSuperclass();
}
//然后以eventClass为key,保存到eventTypesCache中
eventTypesCache.put(eventClass, eventTypes);
}
return eventTypes;
}
/**获取所有接口*/
/** Recurses through super interfaces. */
static void addInterfaces(List<Class<?>> eventTypes, Class<?>[] interfaces) {
for (Class<?> interfaceClass : interfaces) {
if (!eventTypes.contains(interfaceClass)) {
eventTypes.add(interfaceClass);
addInterfaces(eventTypes, interfaceClass.getInterfaces());
}
}
}
测试
static abstract class People implements onClickListener{
String name;
String id;
public People(String name,String id){
this.name = name;
this.id = id;
}
public People(){
}
}
static interface onClickListener{
public void onClick();
}
public static void main(String[] args) {
lookupAllEventTypes(People.class);
Set<Entry<Class<?>, List<Class<?>>>> set = eventTypesCache.entrySet();
for(Entry<Class<?>, List<Class<?>>> entry:set){
List<Class<?>> list = entry.getValue();
for(Class clazz:list){
System.out.println("key="+entry.getKey()+",value="+clazz);
}
}
}
测试结果
key=class test.Demo$People,value=class test.Demo$People
key=class test.Demo$People,value=interface test.Demo$onClickListener
key=class test.Demo$People,value=class java.lang.Object