您的位置:首页 > 其它

获取CurrentClass的所有SuperClass和接口

2016-06-07 15:37 316 查看

根据当前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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class