参考一下,或许对你有用: import java.util.*; import java.lang.reflect.*; class User{ } public class GenericTest{ public static List<User> list=null; public static void main(String args[])throws Exception{ Class<GenericTest> clazz = GenericTest.class; Field field=clazz.getDeclaredField("list"); Type type=field.getGenericType(); System.out.println(type); } }
List是个容器,泛型参数规定了这个容器里面能放什么
List<User> list = null; 这样的写法你都是已知的泛型了,还需要判断么? 除非是 List<Object> list = null; 你在不知道当前泛型的时候,可以使用 if(list.get(i) instanceof User) { ... } 这样的判断,来确定你的泛型。
5楼的正合我意,可是现在又出了个问题, Type type=field.getGenericType(); 得到了type,那我怎样实例化User这个对象呢, 本来是准备Class.forName(type.toString).newInstance()的;但是type.toString前面有个class 的说明,我不想通过subString来得到,有没有更好的解决办法?
list.add(user);
参考一下,或许对你有用:
import java.util.*;
import java.lang.reflect.*;
class User{
}
public class GenericTest{
public static List<User> list=null;
public static void main(String args[])throws Exception{
Class<GenericTest> clazz = GenericTest.class;
Field field=clazz.getDeclaredField("list");
Type type=field.getGenericType();
System.out.println(type);
}
}
这样的写法你都是已知的泛型了,还需要判断么?
除非是
List<Object> list = null;
你在不知道当前泛型的时候,可以使用
if(list.get(i) instanceof User) {
...
}
这样的判断,来确定你的泛型。
Type type=field.getGenericType(); 得到了type,那我怎样实例化User这个对象呢,
本来是准备Class.forName(type.toString).newInstance()的;但是type.toString前面有个class 的说明,我不想通过subString来得到,有没有更好的解决办法?
private static Class readGeneric(String name) throws Exception {
Field list = MainTest.class.getDeclaredField(name);
list.setAccessible(true);
if (list.getGenericType() instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType)
list.getGenericType();
return (Class) pt.getActualTypeArguments()[0];
}else{
throw new RuntimeException("不是泛型");
}
}把list传一下就行了
你都List<User>了,还判断放的是什么?
Iterator i = (User).iterator();
while(i.hasNext()){
User users=(User)i.next();
}
再加一个方法
public void addUser(User user){
users.add(user);
}
这个要到实际当中才能真正的体会到其中的好处所在
Class<?> classs = Class.forName(根据类反射机制获取的类名,要有完整的包路径);//加载类
Class[] argClass = {};//参数
//Class[] argClass = {Integer.class,Double.class};//参数
Constructor<?> cons = classs.getConstructor(argClass);//获得此类的构造器
Object[] args = {};//构造器参数
cons.newInstance(args);//实例化基本就是这样了。
这样的写法你都是已知的泛型了啊!
Constructor[] ctors = Class.class.getDeclaredConstructors();
//比如调用12楼就可以得到这里的ClassConstructor ctor = null;
for (int i = 0; i < ctors.length; i++) {
ctor = ctors[i];
if (ctor.getGenericParameterTypes().length == 0)
break;
} try {
ctor.setAccessible(true);
Object retobj = ctor.newInstance();
}
catch (Throwable e) {
System.err.println(e);
}