我在编写的代码生成器中使用Javassist。很好,但是我遇到了一个问题。

当我查看有问题的CtField时,我想确定它是否是一个集合。这对于普通反射来说是微不足道的:

Collection.class.isAssignableFrom(...)


但是我还没有弄清楚如何从Javassist获得相同的效果。这是非常基本的东西,所以我必须只是想念它。

最佳答案

我认为Javassist没有类似之处,但是遍历接口层次结构相当容易。

public boolean isImplementor(final CtClass interfaceClass,
                             final CtClass clazz) throws NotFoundException {
    return isImplementor(interfaceClass, clazz.getInterfaces())
        || isImplementor(interfaceClass, clazz.getSuperclass());
}

private boolean isImplementor(final CtClass interfaceClass,
                              final CtClass[] interfaces) throws NotFoundException {
    for (final CtClass intf : interfaces) {
        if (intf == interfaceClass || isImplementor(interfaceClass,
                                                    intf.getInterfaces())) {
            return true;
        }
    }
    return false;
}

09-03 18:57