获取CurrentClass的所有SuperClass和接口

根据当前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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值