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;
@Override
public void test(String s, String d) {
System.out.println(s);
}
}
public class InnerParameterized implements IParameterized.InnerParameterized<Integer> {
@Override
public 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.ParameterizedTypeImpl
System.out.println(genericType.getClass().getName());
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
// libcore.reflect.WildcardTypeImpl
System.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.CharSequence
System.out.println(upperBound);
}
}
}
I/System.out: libcore.reflect.ParameterizedTypeImpl I/System.out: libcore.reflect.WildcardTypeImpl
I/System.out: interface java.lang.CharSequence