jdk基础接口类
Type:是java语言中所有类型的父类接口;
ParameterizedType:参数化类型接口;
rawType:返回承接参数的类或接口对象getActualTypeArguments:返回参数化类型中的参数数组;
getOwnerType:返回当前类型所属的上级类型,如:O<T>.I<S>,则返回O<T>;当前已是顶级对象时,则返回null;
====
List<String>
rawType: List;
getActualTypeArguments:types[0] == String && types.length == 1;
getOwnerType:null
Map<String, Integer>
rawType: Map;
getActualTypeArguments:types[0] == String && types[1] == Integer && types.length == 2;
getOwnerType:null
GenericArrayType:泛型数组类型接口
这个类型容易迷惑;jdk介绍:{@code GenericArrayType} represents an array type
whose component type is either a parameterized type or a type variable.
数组中的元素是参数化类型或者是变量类型;
即:int[]、Integer[]、String[]都是Class类型,而并非是GenericArrayType类型;
====
List<String>[] method1();
<T> T[] method2;
以上两种方法的返回值都属于GenericArrayType类型;
List<String>[]:
getGenericComponentType:List<String>属于ParameterizedType类型
<T> T[]:
getGenericComponentType:T属于TypeVariable类型
TypeVariable:变量类型接口
public interface Level0Mapper<L, M, N> {}L、M、N都属于变量
GenericDeclaration:泛型定义接口
该接口在类图中有两处出现;1.Class类的实现接口,如interface Level0Mapper<L, M, N>{}接口中
的L、M、N就是就是Level0Mapper.class所定义的泛型;
getTypeParameters():
TypeVariables.length day ==3 && TypeVariables[0] == L
&& TypeVariables[1] == M && TypeVariables[2] == N;
2.TypeVariable接口中的方法getGenericDeclaration,返回值是定义该泛型变量的类名,
这其实与Method.getDeclaringClass、Field.getDeclaringClass()含义类似,
都是返回定义该泛型、方法、属性的类名;
Class:应用运行中的所有类和接口的类实例
该类属于java开发者最熟知的类了,所有的对象进行装载后都是Class类的二进制文件;Class有类似于GenericArrayType接口中的方法,如:getComponentType,
int[]、String[]属于Class类型,同时也是引用类型,
int[]:
getComponentType:int.class
isArray:true
String[]:
getComponentType:String.class
isArray:true
List:
getComponentType:null
isArray:false
同时实现GenericDeclaration接口,可获取在该Class中定义的泛型元素
WIldcardType:通配符类型
List<? extends Integer & Comparator, ? super Age> method();该方法返回值的类型是ParameterizedType类型
rawType:List
getActualTypeArguments:args[0]是WildcardType类型
getUpperBounds:bounds[0] == Integer 父类类型
getLowerBounds: bounds[0] == Age 子类类型
以上只是针对每个接口类型做了阐述,或许有很多描述不够准确,欢迎拍砖指正;
现在写一个比较简单的测试类,来体现部分类型接口的使用场景
public interface Level0Mapper<L, M, N> { List<N> selectList(L param1, M param2);
}
public interface Level1Mapper<E, F> extends Level0Mapper<Date, Long, String> {
}
@Test
void test() {
Class<?> clazz = Level1Mapper.class;
Method method = clazz.getMethod("selectList", Object.class, Object.class);
ParameterizedType returnType = (ParameterizedType) method.getGenericReturnType();
assertEquals(List.class, returnType.getRawType());
String returnVar = ((TypeVariable) returnType.getActualTypeArguments()[0]).getName();
Type[] paramTypes = method.getGenericParameterTypes();
String paramVarOne = ((TypeVariable) paramTypes[0]).getName();
String paramVarTwo = ((TypeVariable) paramTypes[1]).getName();
ParameterizedType parentInter = (ParameterizedType) Level1Mapper.class.getGenericInterfaces()[0];
Type[] args = parentInter.getActualTypeArguments();
Class<?> superClass = (Class<?>) parentInter.getRawType();
TypeVariable[] vars = superClass.getTypeParameters();
Map<String, Type> paramMap = new HashMap<>();
for (int i=0; i< args.length; i++) {
paramMap.put(vars[i].getName(), args[i]);
}
assertEquals(String.class, paramMap.get(returnVar)); // 返回类型是String类型
assertEquals(Date.class, paramMap.get(paramVarOne)); // 第一个入参是Date类型
assertEquals(Long.class, paramMap.get(paramVarTwo)); // 第二个入参是Long类型
}
上面的例子比较容易理解,后续会将框架中的运用加以补充!!!
以上是 jdk基础接口类 的全部内容, 来源链接: utcz.com/z/514001.html