如何在 class 中找到所有使用反射在 java 中扩展其他 class 的接口

How to find all interfaces in class that extends other classes with other interfaces using reflection in java

例如我有:

interface IA;
interface IB;

public class B implements IB;
public class A extends B implements IA;

如何在 A.class 中找到扩展 B.class 中所有已实现的接口?方法 Class<?> getInterfaces() returns 仅在 A [=21] 中找到接口=] 未扩展 class.

获取 superclass 及其接口

Class<?> clazz = A.class;
Class<?>[] interfaces = clazz.getSuperclass().getInterfaces();
// add interfaces to some larger list

递归执行此操作,直到超类为 Objectnull

If this Class represents either the Object class, an interface, a primitive type, or void, then null is returned.

你必须循环,在 A 上调用 getInterfaces,然后使用 getSuperclass 得到它的超级 class,然后再做一遍,等等,直到getSuperclass returns null.

List<Class<?>> list = new LinkedList<Class<?>>();
Class<?> cls = A.class;
while (cls != null) {
    // Call cls.getInterfaces, add result to list
    // ...

    // Go to its parent
    cls = cls.getSuperclass();
}

番石榴解决方案:

Proxies.java

public static TypeToken.TypeSet getTypes(@Nonnull final Class cls)
{
    return TypeToken.of(cls).getTypes();
}

public static TypeToken subClassesOf(@Nonnull final Class superClass, @Nonnull final Set<TypeToken> typeTokens)
{
    for (final TypeToken tt : typeTokens)
    {
        if (tt.getRawType().getSuperclass() == null)
        {
            return tt;
        }
        {
            return subClassesOf(superClass, tt.getTypes().interfaces());
        }
    }
    return null;
}

您可以这样称呼它:

    final Class superClass = // super class you want the subclass Interface of
    final TypeToken tt = TypeToken.of(superClass.getClass());
    final TypeToken tti = Proxies.subClassesOf(superClass.getClass(),tt.getTypes().interfaces());
    final Class subTypeInterface = tti.getRawType();

我用它从 DyanmicProxy 实例中提取 Annotations,其中 Annotations 在专门的 SubType 接口上。