java.lang.reflect.Type

Type是一个公共接口,表示Java中所有的类型。包括raw Types,参数化类型,数组类型,类型变量以及原生类型。

  1. public interface IParameterized<T, D> {
  2. void test(T t, D d);
  3. interface InnerParameterized<I> {
  4. void inner(I i);
  5. }
  6. }
  7. public class StringParameterized implements IParameterized<String, String> {
  8. private Child mChild;
  9. @Override
  10. public void test(String s, String d) {
  11. System.out.println(s);
  12. }
  13. }
  14. public class InnerParameterized implements IParameterized.InnerParameterized<Integer> {
  15. @Override
  16. public void inner(Integer integer) {
  17. }
  18. }

ParameterizedType

  1. public interface ParameterizedType extends Type {
  2. }

参数化类型,是一个公共接口。形如Collection.

Type[] getActualTypeArguments()

获取该参数化类型的真实类型

  1. Type[] genericInterfaces = StringParameterized.class.getGenericInterfaces();
  2. Arrays.stream(genericInterfaces)
  3. .filter(t -> t instanceof ParameterizedType)
  4. .map(type -> ((ParameterizedType) type))
  5. .flatMap((Function<ParameterizedType, Stream<Type>>) parameterizedType -> Arrays.stream(parameterizedType.getActualTypeArguments()))
  6. .forEach(t -> {
  7. System.out.println(t);
  8. System.out.println(t.getTypeName());
  9. });

class java.lang.String class java.lang.String

Type getOwnerType()

如果这个type是一个参数化类型的内部类,那个返回的是顶层类的ParameterType。如果type是一个顶层类,那么返回null.

Type getRawType()

返回当前类或接口声明的Type。

示例代码:

  1. Type[] interfaces = StringParameterized.class.getGenericInterfaces();
  2. ParameterizedType parameterizedType = (ParameterizedType) interfaces[0];
  3. System.out.println(parameterizedType.getOwnerType());
  4. System.out.println(parameterizedType.getRawType());
  5. Type[] interfaces = InnerParameterized.class.getGenericInterfaces();
  6. ParameterizedType parameterizedType = (ParameterizedType) interfaces[0];
  7. System.out.println(parameterizedType.getOwnerType());
  8. 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

  1. public interface TypeVariable<D extends GenericDeclaration> extends Type {
  2. }

泛型的类型变量,是一个公共接口。例如List,Map中的T,K,V等变量,可以表示任何类。

注意:**ParameterizedType**代表的是整个泛型,**TypeVariable**代表的是泛型中的变量。
**

Type[] getBounds()

获取类型变量的上界。如果没有明确的上界,则获取到的则是Object。

D getGenericDeclaration()

获取声明该类型变量实体(即获取类,方法或构造器名)

String getName()

获取名称,即 KVE之类名称

  1. List<DefaultTypeVariableModel> list = new ArrayList<>();
  2. TypeVariable<? extends Class<? extends List>>[] typeParameters = list.getClass().getTypeParameters();
  3. for (TypeVariable<? extends Class<? extends List>> typeVariable : typeParameters) {
  4. System.out.println(typeVariable.getName());
  5. Type[] bounds = typeVariable.getBounds();
  6. for (Type bound : bounds) {
  7. System.out.println(bound);
  8. }
  9. Class<? extends List> declaration = typeVariable.getGenericDeclaration();
  10. System.out.println(declaration);
  11. }
  12. TypeVariable<Class<AbsBaseTypeVariableImpl>>[] typeParameters1 = AbsBaseTypeVariableImpl.class.getTypeParameters();
  13. for (TypeVariable<Class<AbsBaseTypeVariableImpl>> classTypeVariable : typeParameters1) {
  14. System.out.println(classTypeVariable.getName());
  15. Type[] bounds = classTypeVariable.getBounds();
  16. for (Type bound : bounds) {
  17. System.out.println(bound);
  18. }
  19. Class<AbsBaseTypeVariableImpl> declaration = classTypeVariable.getGenericDeclaration();
  20. System.out.println(declaration);
  21. }

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

数组类型,数组元素为ParameterizedTypeTypeVariable类型。

Type getGenericComponentType()

返回数组元素的Type

  1. try {
  2. AbsBaseTypeVariableImpl<DefaultTypeVariableModel> variable = new AbsBaseTypeVariableImpl();
  3. Field field = variable.getClass().getField("ts");
  4. Type genericType = field.getGenericType();
  5. GenericArrayType type = (GenericArrayType) genericType;
  6. System.out.println(type);
  7. Type componentType = type.getGenericComponentType();
  8. System.out.println(componentType instanceof ParameterizedType);
  9. System.out.println(componentType instanceof TypeVariable);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }

I/System.out: T[] I/System.out: false I/System.out: true

WidecardType

WildcardType表示一个通配符型表达式,如 ?? extends Number ,或 ? super Integer 等。

Type[] getUpperBounds()

获取上边界Type

Type[] getLowerBounds()

获取下边界Type

  1. field = variable.getClass().getField("datas");
  2. genericType = field.getGenericType();
  3. // libcore.reflect.ParameterizedTypeImpl
  4. System.out.println(genericType.getClass().getName());
  5. ParameterizedType parameterizedType = (ParameterizedType) genericType;
  6. Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
  7. for (Type actualTypeArgument : actualTypeArguments) {
  8. // libcore.reflect.WildcardTypeImpl
  9. System.out.println(actualTypeArgument.getClass().getName());
  10. WildcardType wildcardType = (WildcardType) actualTypeArgument;
  11. for (Type lowerBound : wildcardType.getLowerBounds()) {
  12. System.out.println(lowerBound);
  13. }
  14. for (Type upperBound : wildcardType.getUpperBounds()) {
  15. // java.lang.CharSequence
  16. System.out.println(upperBound);
  17. }
  18. }
  19. }

I/System.out: libcore.reflect.ParameterizedTypeImpl I/System.out: libcore.reflect.WildcardTypeImpl

I/System.out: interface java.lang.CharSequence