反射對應泛型引數的呼叫
阿新 • • 發佈:2019-01-27
package invokeGenerator;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Map;
import org.omg.Dynamic.Parameter;
class User{
public Map<String,Object> map;
}
/*
* 獲取含泛型的欄位,獲取泛型的型別;在GeneratorDao中會用到
*/
public class Generator {
public static void main(String[] args) throws Exception {
Class claz = User.class;
Field ma=claz.getField("map");
/*獲取欄位*/
System.out.println(ma);
/*得到欄位名稱*/
System.out.println(ma.getName());
/*呼叫getGenericType獲取一個泛型型別 (type是所以泛型型別的介面)*/
Type type = ma.getGenericType();
System.out.println(type);
/*強轉為引數泛型型別*/
ParameterizedType paraType = (ParameterizedType) type;
/*呼叫方法getActualTypeArguments;獲取到引數的泛型型別*/
Type[] types = paraType.getActualTypeArguments();
System.out.println(types[0]+"***"+types[1]);
/********************************操作泛型引數的方法******************************/
/*1獲取該泛型引數方法所在類的class物件(以Arrays為例子)*/
Class array = Arrays.class;
/*2.由於不知道具體方法的具體引數型別所以這裡先獲取所有方法,然後篩選需要測試的方法*/
Method[] arrayMetods = array.getMethods();
/*遍歷獲取的方法陣列,通過方法名篩選測試的方法*/
Method asList = null;
for(Method method:arrayMetods){
if("asList".equals(method.getName())){
asList = method;
System.out.println(method);
}
// System.out.println(method);
}
/*3呼叫方法*/
/*注意不定引數的傳遞方式*/
System.out.println(asList.invoke(null, new Object[]{new Object[]{"a","b","c","d"}}));
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Map;
import org.omg.Dynamic.Parameter;
class User{
public Map<String,Object> map;
}
/*
* 獲取含泛型的欄位,獲取泛型的型別;在GeneratorDao中會用到
*/
public class Generator {
public static void main(String[] args) throws Exception {
Class claz = User.class;
Field ma=claz.getField("map");
/*獲取欄位*/
System.out.println(ma);
/*得到欄位名稱*/
System.out.println(ma.getName());
/*呼叫getGenericType獲取一個泛型型別 (type是所以泛型型別的介面)*/
Type type = ma.getGenericType();
System.out.println(type);
/*強轉為引數泛型型別*/
ParameterizedType paraType = (ParameterizedType) type;
/*呼叫方法getActualTypeArguments;獲取到引數的泛型型別*/
Type[] types = paraType.getActualTypeArguments();
System.out.println(types[0]+"***"+types[1]);
/********************************操作泛型引數的方法******************************/
/*1獲取該泛型引數方法所在類的class物件(以Arrays為例子)*/
Class array = Arrays.class;
/*2.由於不知道具體方法的具體引數型別所以這裡先獲取所有方法,然後篩選需要測試的方法*/
Method[] arrayMetods = array.getMethods();
/*遍歷獲取的方法陣列,通過方法名篩選測試的方法*/
Method asList = null;
for(Method method:arrayMetods){
if("asList".equals(method.getName())){
asList = method;
System.out.println(method);
}
// System.out.println(method);
}
/*3呼叫方法*/
/*注意不定引數的傳遞方式*/
System.out.println(asList.invoke(null, new Object[]{new Object[]{"a","b","c","d"}}));
}
}