環(huán)境
Java:1.8
Intellij IDEA:2019.2.4
前言
最近在寫導(dǎo)出程序,對getGenericParameterTypes和getParameterTypes兩個方法的區(qū)別產(chǎn)生了好奇衙耕。
區(qū)別
這兩個方法都是用來獲取方法形參類型的。
getGenericParameterTypes:返回Type類型的數(shù)組 Type[].
getParameterTypes:返回Class類型的數(shù)組: Class<?>[].
Type是一個高級接口已维;具體的說明來看一段網(wǎng)上的解釋:
Type 是所有類型的高級公共接口芭梯,當(dāng)然也是Class的父類。
它們包括原始類型觉痛、參數(shù)化類型琴儿、數(shù)組類型段化、類型變量和基本類型。
先來看一下Type 的用法:
①type是一種表示編程語言中的所有類型的類超級接口:
如:int造成、Integer显熏、String 這都是表示一編程語言的類型,而其中的 int.class晒屎、Integer.class喘蟆、String.class 它們表示的是類型的實例缓升。
②我們以前學(xué)習(xí)的反射 Class c = Integer.class,Class相當(dāng)于表示類型的類,而Integer.class 則是一種名為整形類型的類型實例蕴轨。
③理解了上面的那些港谊,其理解 type就不難了,type 與 class 一樣橙弱,不過 type是一種比Class 表示范圍還要廣的超級接口歧寺,它表示Java語言中類型的所有接口。
示例代碼
首先假設(shè)有這么一個類:SampleClass
這個類有兩個屬性棘脐,一個String類型成福,一個泛型List<Integer>。
import java.util.List;
public class SampleClass {
private String sampleField;
private List<Integer> ids;
public String getSampleField() {
return sampleField;
}
public void setSampleField(String sampleField) {
this.sampleField = sampleField;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
然后寫測試代碼:
public static void main(String[] args) {
Class sampleClassClass = SampleClass.class;
Method[] methods = sampleClassClass.getMethods();
for (Method method : methods) {
System.out.println("------------------" +method.getName());
Type[] genericParameterTypes =
method.getGenericParameterTypes();
Class<?>[] parameterTypes = method.getParameterTypes();
for(Class parameterType: parameterTypes){
System.out.println(parameterType + "===="+
parameterType.getName());
}
for (int i = 0; i < genericParameterTypes.length; i++) {
System.out.println(genericParameterTypes[i] +
"=====" + genericParameterTypes[i].getTypeName());
}
}
運行結(jié)果如下:
① String類型荆残,這兩個方法返回的結(jié)果是一樣的
② List<Integer> ,getParameterTypes 只返回了類型净当,泛型沒有返回内斯;
而getGenericParameterTypes返回的是完整的泛型。
結(jié)論
①如果方法參數(shù)不是參數(shù)化類型(泛型)像啼,那么getParameterTypes和getGenericParameterTypes返回的結(jié)果是一樣的俘闯。
②如果方法參數(shù)是泛型,這時就有區(qū)別了忽冻,getGenericParameterTypes會返回完整的信息真朗,而getParameterTypes只會返回參數(shù)類型,參數(shù)化類型無法得到僧诚。
獲取參數(shù)化類型
// 將類型向參數(shù)化類型轉(zhuǎn)換
ParameterizedType t = (ParameterizedType)genericParameterTypes[0];
// 可以得到參數(shù)化類型的參數(shù)實例
t.getActualTypeArguments()[0];
參考地址:
反射得到參數(shù)化類型中的類型參數(shù)
https://www.yiibai.com/javareflect/javareflect_method_getgenericparametertypes.html
https://www.yiibai.com/javareflect/javareflect_method_getparametertypes.html