如何在 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
递归执行此操作,直到超类为 Object
或 null
。
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
接口上。
例如我有:
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
递归执行此操作,直到超类为 Object
或 null
。
If this
Class
represents either theObject
class, an interface, a primitive type, orvoid
, thennull
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
接口上。