获取CurrentClass的所有SuperClass和接口

来源:互联网 发布:java xml 字节点 编辑:程序博客网 时间:2024/05/19 02:03

根据当前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$Peoplekey=class test.Demo$People,value=interface test.Demo$onClickListenerkey=class test.Demo$People,value=class java.lang.Object
0 0
原创粉丝点击