好的,这里有一种方法...我并不是说这是最好的(甚至不是一个好的)方法,我只是说你可能能够根据自己的需求进行调整。
package forums;
import java.util.List;
import java.util.Set;
import java.lang.reflect.*;
class Class1<O,P,Q> {}
class Class2<R,S> extends Class1<R, String, S> {}
class Class3<U> extends Class2<List,U> {}
class Class4<W> extends Class2<W,Set> {}
public class GenericTypeHeirarchy
{
public static void main(String[] args) {
try {
PrintGenericAncestorTypes(Class4.class, " ");
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static void PrintGenericAncestorTypes(Class clazz, String pad) {
Type supaType = clazz.getGenericSuperclass();
ParameterizedType paramSupaType = null;
if (supaType instanceof ParameterizedType)
paramSupaType = (ParameterizedType) supaType;
if (paramSupaType == null)
return;
Type[] supasArgTypes = paramSupaType.getActualTypeArguments();
for ( Type t : supasArgTypes ) {
if (t instanceof TypeVariable) {
System.out.println( pad + clazz.getName() + ": <" + t + ">");
PrintGenericAncestorTypes(clazz.getSuperclass(), pad + " ");
} else {
System.out.println( pad + clazz.getName() + ": " + t);
}
}
}
}
编辑:
这可能仍然不是您想要的...我认为您需要的是每个泛型参数类型的类(或类名)...但这已经是我能到达的极限了。我不知道如何为Type获取Class... Type接口为空,因此必须将其转换为某些内容才能从中获取类(或类名),而read-arg-types(例如java.lang.String)并不是Type的任何已知子接口(GenericArrayType、ParameterizedType、TypeVariable或WildcardType)。我假设是的一个实例。
所以这是我的改进版本,但我被卡住了,不知道该怎么办。
package forums;
import java.util.List;
import java.util.Set;
import java.lang.reflect.*;
class Class1<O,P,Q> {}
class Class2<R,S> extends Class1<R, String, S> {}
class Class3<U> extends Class2<List,U> {}
class Class4<W> extends Class2<W,Set> {}
public class GenericTypeHeirarchy
{
public static void main(String[] args) {
try {
PrintGenericTypeTree(Class4.class);
System.out.println("--------------------------\n");
PrintGenericTypeTree(Class3.class);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void PrintGenericTypeTree(Class clazz) {
if (clazz == null || clazz == java.lang.Object.class)
return;
System.out.print( "class " + clazz.getName() );
TypeVariable[] argTypes = clazz.getTypeParameters();
if (argTypes.length == 0)
return;
System.out.print( "<" );
boolean first = true;
for ( TypeVariable t : argTypes ) {
System.out.print( (first?"":", ") + t.getName() );
first = false;
}
System.out.print("> extends ");
Class supaClass = clazz.getSuperclass();
System.out.print(supaClass.getName());
Type genericSupaType = clazz.getGenericSuperclass();
ParameterizedType paramSupaType = null;
if (genericSupaType instanceof ParameterizedType)
paramSupaType = (ParameterizedType) genericSupaType;
if (paramSupaType == null) {
System.out.println();
return;
}
Type[] supasArgTypes = paramSupaType.getActualTypeArguments();
first = true;
System.out.print( "<" );
for ( Type t : supasArgTypes ) {
System.out.print( (first?"":", ") + t );
first = false;
}
System.out.println(">");
PrintGenericTypeTree(supaClass);
}
}
... 这里是输出结果 ...
C:\Java\home\src\forums>"C:\Program Files\Java\jdk1.6.0_16\bin\java.exe" -Xms4m -Xmx256m -enableassertions -cp c:\java\home\src;C:\Java\home\classes; forums.GenericTypeHeirarchy
class forums.Class4<W> extends forums.Class2<W, interface java.util.Set>
class forums.Class2<R, S> extends forums.Class1<R, class java.lang.String, S>
class forums.Class1<O, P, Q> extends java.lang.Object
--------------------------
class forums.Class3<U> extends forums.Class2<interface java.util.List, U>
class forums.Class2<R, S> extends forums.Class1<R, class java.lang.String, S>
class forums.Class1<O, P, Q> extends java.lang.Object