java.lang.reflect.Type
Type是一个公共接口,表示Java中所有的类型。包括raw Types,参数化类型,数组类型,类型变量以及原生类型。
public interface IParameterized<T, D> {void test(T t, D d);interface InnerParameterized<I> {void inner(I i);}}public class StringParameterized implements IParameterized<String, String> {private Child mChild;@Overridepublic void test(String s, String d) {System.out.println(s);}}public class InnerParameterized implements IParameterized.InnerParameterized<Integer> {@Overridepublic void inner(Integer integer) {}}
ParameterizedType
public interface ParameterizedType extends Type {}
参数化类型,是一个公共接口。形如Collection
Type[] getActualTypeArguments()
获取该参数化类型的真实类型
Type[] genericInterfaces = StringParameterized.class.getGenericInterfaces();Arrays.stream(genericInterfaces).filter(t -> t instanceof ParameterizedType).map(type -> ((ParameterizedType) type)).flatMap((Function<ParameterizedType, Stream<Type>>) parameterizedType -> Arrays.stream(parameterizedType.getActualTypeArguments())).forEach(t -> {System.out.println(t);System.out.println(t.getTypeName());});
class java.lang.String class java.lang.String
Type getOwnerType()
如果这个type是一个参数化类型的内部类,那个返回的是顶层类的ParameterType。如果type是一个顶层类,那么返回null.
Type getRawType()
返回当前类或接口声明的Type。
示例代码:
Type[] interfaces = StringParameterized.class.getGenericInterfaces();ParameterizedType parameterizedType = (ParameterizedType) interfaces[0];System.out.println(parameterizedType.getOwnerType());System.out.println(parameterizedType.getRawType());Type[] interfaces = InnerParameterized.class.getGenericInterfaces();ParameterizedType parameterizedType = (ParameterizedType) interfaces[0];System.out.println(parameterizedType.getOwnerType());System.out.println(parameterizedType.getRawType());
I/System.out: null I/System.out: interface com.bujian.reflects.type.IParameterized I/System.out: interface com.bujian.reflects.type.IParameterized I/System.out: interface com.bujian.reflects.type.IParameterized$InnerParameterized
TypeVariable
public interface TypeVariable<D extends GenericDeclaration> extends Type {}
泛型的类型变量,是一个公共接口。例如List
注意:**ParameterizedType**代表的是整个泛型,**TypeVariable**代表的是泛型中的变量。
**
Type[] getBounds()
获取类型变量的上界。如果没有明确的上界,则获取到的则是Object。
D getGenericDeclaration()
获取声明该类型变量实体(即获取类,方法或构造器名)
String getName()
获取名称,即 K、V、E之类名称
List<DefaultTypeVariableModel> list = new ArrayList<>();TypeVariable<? extends Class<? extends List>>[] typeParameters = list.getClass().getTypeParameters();for (TypeVariable<? extends Class<? extends List>> typeVariable : typeParameters) {System.out.println(typeVariable.getName());Type[] bounds = typeVariable.getBounds();for (Type bound : bounds) {System.out.println(bound);}Class<? extends List> declaration = typeVariable.getGenericDeclaration();System.out.println(declaration);}TypeVariable<Class<AbsBaseTypeVariableImpl>>[] typeParameters1 = AbsBaseTypeVariableImpl.class.getTypeParameters();for (TypeVariable<Class<AbsBaseTypeVariableImpl>> classTypeVariable : typeParameters1) {System.out.println(classTypeVariable.getName());Type[] bounds = classTypeVariable.getBounds();for (Type bound : bounds) {System.out.println(bound);}Class<AbsBaseTypeVariableImpl> declaration = classTypeVariable.getGenericDeclaration();System.out.println(declaration);}
I/System.out: E I/System.out: class java.lang.Object I/System.out: class java.util.ArrayList I/System.out: T I/System.out: class com.bujian.reflects.type.BaseTypeVariableModel I/System.out: class com.bujian.reflects.type.AbsBaseTypeVariableImpl
GenericArrayType
数组类型,数组元素为ParameterizedType或TypeVariable类型。
Type getGenericComponentType()
返回数组元素的Type。
try {AbsBaseTypeVariableImpl<DefaultTypeVariableModel> variable = new AbsBaseTypeVariableImpl();Field field = variable.getClass().getField("ts");Type genericType = field.getGenericType();GenericArrayType type = (GenericArrayType) genericType;System.out.println(type);Type componentType = type.getGenericComponentType();System.out.println(componentType instanceof ParameterizedType);System.out.println(componentType instanceof TypeVariable);} catch (Exception e) {e.printStackTrace();}
I/System.out: T[] I/System.out: false I/System.out: true
WidecardType
WildcardType表示一个通配符型表达式,如 ? , ? extends Number ,或 ? super Integer 等。
Type[] getUpperBounds()
获取上边界Type
Type[] getLowerBounds()
获取下边界Type
field = variable.getClass().getField("datas");genericType = field.getGenericType();// libcore.reflect.ParameterizedTypeImplSystem.out.println(genericType.getClass().getName());ParameterizedType parameterizedType = (ParameterizedType) genericType;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {// libcore.reflect.WildcardTypeImplSystem.out.println(actualTypeArgument.getClass().getName());WildcardType wildcardType = (WildcardType) actualTypeArgument;for (Type lowerBound : wildcardType.getLowerBounds()) {System.out.println(lowerBound);}for (Type upperBound : wildcardType.getUpperBounds()) {// java.lang.CharSequenceSystem.out.println(upperBound);}}}
I/System.out: libcore.reflect.ParameterizedTypeImpl I/System.out: libcore.reflect.WildcardTypeImpl
I/System.out: interface java.lang.CharSequence
