给定两个非接口(interface)类ab,为了找到最接近的公共(public)父类(super class),我执行以下操作:

static Class<?> findClosestCommonSuper(final Class<?> a, final Class<?> b) {
    Iterator<Class<?>> pathA = pathFromObject(a).iterator();
    Iterator<Class<?>> pathB = pathFromObject(b).iterator();
    Class<?> res = Object.class;
    Class<?> c;
    while (pathA.hasNext() && pathB.hasNext()) {
        if ((c = pathA.next()) == pathB.next())
            res = c;
    }
    return res;
}
pathFromObject()List<Class<?>>返回代表继承链的Object.class:
static List<Class<?>> pathFromObject(Class<?> cl) {
    List<Class<?>> res = new ArrayList<>();
    while (cl != null) {
        res.add(cl);
        cl = cl.getSuperclass();
    }
    Collections.reverse(res);
    return res;
}

我的问题是:为此是否存在一些现成的JDK解决方案?也许使用类加载器或某些特定功能。或者是不需要两次迭代的更好算法。

最佳答案

我认为最简单的实现是

static Class<?> findClosestCommonSuper(Class<?> a, Class<?> b) {
    while (!a.isAssignableFrom(b))
        a = a.getSuperclass();
    return a;
}

09-11 19:44
查看更多