和反射+泛型有關的接口類型
- java.lang.reflect.Type:java語言中所有類型的公共父接口
- java.lang.reflect.ParameterizedType
- java.lang.reflect.GenericArrayType
- java.lang.reflect.WildcardType
- java.lang.reflect.TypeVariable
1. Type直接子接口
ParameterizedType,GenericArrayType,TypeVariable和WildcardType四種類型的接口
- ParameterizedType: 表示一種參數化的類型,比如Collection
- GenericArrayType: 表示一種元素類型是參數化類型或者類型變量的數組類型
- TypeVariable: 是各種類型變量的公共父接口
- WildcardType: 代表一種通配符類型表達式,比如?, ? extends Number, ? super Integer【wildcard是一個單詞:就是“通配符”】
2. Type直接實現子類 :Class類
3. java.lang.reflect.Type接口
Type所有類型指代的有:原始類型 (raw types)【對應Class】,參數化類型 (parameterizedtypes)【對應ParameterizedType】, 數組類型 (array types)【對應GenericArrayType】,類型變量 (type variables)【對應TypeVariable】,基本數據類型(primitivetypes)【仍然對應Class】
4. java.lang.reflect.ParameterizedType接口
ParameterizedType接口類型的含義: 表示參數化類型。比如:Map這種參數化類型
獲取參數化類型<>中的實際類型 ===》源碼聲明:Type[] getActualTypeArguments();
【注意】無論<>中有幾層<>嵌套,這個方法僅僅脫去最外層的<>之后剩下的內容就作為這個方法的返回值。
例子如下:
public class TestController {
public static void main(String[] args) throws Exception {
TestController testController = new TestController(); //獲取當前類
Method testParam = testController.getClass().getMethod("testParam", ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class, ArrayList.class); //獲取下面的方法
Type[] genericParameterTypes = testParam.getGenericParameterTypes(); //獲取方法泛型類參數
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericParameterType; //強轉為泛型類
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); //獲取泛型真實聲明的類型,調用一次只會去掉最外層的一個<>
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument.getTypeName()); //打印真實類型
}
}
}
}
public <E> E testParam(ArrayList<ArrayList<Integer>> al1,
ArrayList<E> al2,
ArrayList<String> al3,
ArrayList<? extends Number> al4,
ArrayList<E[]> al5){
Type genericSuperclass = this.getClass().getGenericSuperclass();
Class<?> superclass1 = this.getClass().getSuperclass();
Type genericSuperclass1 = al1.getClass().getGenericSuperclass();
Class<?> superclass = al1.getClass().getSuperclass();
Type aClass = al1.getClass();
if (aClass instanceof ParameterizedType) {
ParameterizedType p1 = (ParameterizedType) aClass;
}
return al2.get(0);
}
}
打印如下:
java.util.ArrayList<java.lang.Integer> // 由此可見只脫去了一層<> E java.lang.String ? extends java.lang.Number E[]
如上方法,那么它的每一參數總體上看都是參數化類型的。
5、 java.lang.reflect. GenericArrayType接口
GenericArrayType接口類型的含義:表示泛型數組類型。比如:void method(E[] al){…} 其中的E[] 就是該接口類型
獲取泛型數組中元素的類型===》 源碼聲明:Type getGenericComponentType();
【注意】無論從左向右有幾個[]並列,這個方法僅僅脫去最右邊的[]之后剩下的內容就作為這個方法的返回值。
例子如下:
import java.lang.reflect.GenericArrayType; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.lang.reflect.Type; import java.util.ArrayList; /** * @author Green * @date 2021年12月31日 2:31 下午 */ public class Test { public static void main(String[] args) throws Exception { Test test = new Test(); Method methodV = test.getClass().getMethod("methodV",String.class, String[].class, Object[].class, ArrayList[].class, Object[][].class); Parameter[] parameters = methodV.getParameters(); for (Parameter parameter : parameters) { Type parameterizedType = parameter.getParameterizedType(); //獲取參數類型 if (GenericArrayType.class.isInstance(parameterizedType)) { // 參數3、4是泛型數組,會走這里 Type genericComponentType = ((GenericArrayType) parameterizedType).getGenericComponentType(); System.out.println(genericComponentType.getTypeName()); } if (Class.class.isInstance(parameterizedType)) { // 參數1、2、4會走這里,是Class類型 System.out.println(((Class) parameterizedType).getTypeName()); } } } public <E> E methodV( String p11, String[] p1, E[] p2, ArrayList[] p3, E[][] p4){ return p2[0]; } }
打印如下:
java.lang.String
java.lang.String[]
E
java.util.ArrayList[]
E[]
6、java.lang.reflect.TypeVariable接口
TypeVariable接口類型的含義: 表示泛型類型參數或者又叫做類型變量。比如:void method(E e){}中的E就是該接口類型
(這里經過驗證,發現后面的內容轉載說的不對,所以沒有復制進來,看這篇:https://www.cnblogs.com/cainiao-Shun666/p/15754113.html 轉載博客會說明該接口用法)
7、java.lang.reflect.WildcardType接口
WildcardType接口類型的含義 :表示通配符類型的表達式
這個接口說明也參考看下一篇轉載博客;
轉載:https://blog.csdn.net/smart_snail/article/details/69295224
看這篇轉載博客更清晰:https://www.cnblogs.com/cainiao-Shun666/p/15754113.html