Class 类的 Type getGenericSuperclass() 获得到type之后强制 转换成ParameterizedType 类型。。然后使用getActualTypeArguments() 获得一个type的数组。。然后取数组的第一个元素。。然后强制转换成class类。。就行了。。
是这样的成员变量 List<List<Integer>> list2 = new ArrayList<List<Integer>> (); 怎么得到Integer.class,
如果这个变量是成员变量,可以得到,是局部变量,得不到 for example import java.lang.reflect.*; public class Test { List<Integer> list = new ArrayList<Integer>(); public static void main(String[] args) throws Throwable { Field f = Test.class.getDeclaredField("list"); //成员变量 Type t = f.getGenericType(); if (t instanceof ParameterizedType) { //可以获得Integer System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]); } List<String> slist = new ArrayList<String>(); //局部变量不能获取String System.out.println(slist.getClass().getTypeParameters()[0].getName()); t = slist.getClass().getGenericSuperclass(); //通过超类也不行 if (t instanceof ParameterizedType) { System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]); } t = slist.getClass().getGenericInterfaces()[0]; //通过超接口也不行 if (t instanceof ParameterizedType) { System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]); } } }
注:是这样的成员变量 List<List<Integer>> list2 = new ArrayList<List<Integer>> ();List<List<Integer>> list2 = new ArrayList<List<Integer>> (); Type type =list2.getClass().getGenericSuperclass(); ParameterizedType gtype =(ParameterizedType) type; if (gtype instanceof ParameterizedType) {
// list the raw type information ParameterizedType ptype = (ParameterizedType)gtype; Type rtype = ptype.getRawType(); System.out.println("rawType is instance of " + rtype.getClass().getName()); System.out.println(" (" + rtype + ")");
} } else { System.out.println ("getGenericType is not a ParameterizedType!");
}我这样写不能获取到Integer.class
不知道你 list中有数据么。。如果有数据就好办了。。 List<Integer> a = new ArrayList<Integer> (); a.add(1); List<List<Integer>> list2 = new ArrayList<List<Integer>> (); list2.add(a); System.out.println(list2.get(0).get(0).getClass().getName());
public class Test { List<List<Integer>> list = new ArrayList<List<Integer>>(); public static void main(String[] args) throws Throwable { Field f = Test.class.getDeclaredField("list"); // 成员变量 Type t = f.getGenericType(); if (t instanceof ParameterizedType) { Type type = ((ParameterizedType) t).getActualTypeArguments()[0]; if (type instanceof ParameterizedType) { Type integerType = ((ParameterizedType) type).getActualTypeArguments()[0]; System.out.println(((Class<?>)integerType).getName()); } } } }
自己解析吧 List<List<Integer>> list2 = new ArrayList<List<Integer>> (); //成员变量public void check() throws Throwable { Type type = this.getClass().getDeclaredField("list2").getGenericType(); if (type instanceof ParameterizedType) {
// list the raw type information ParameterizedType ptype = (ParameterizedType)type; String clsName = ptype..getActualTypeArguments()[0].toString(); if (clsName.matches(".*?<.*?>")) { clsName = clsName.replaceAll(".*?<(.*?)>", "$1"); } System.out.println(clsName); Class c = class.forName(clsName); ... } else { System.out.println ("getGenericType is not a ParameterizedType!");
} }
你可以写个递归方法public class Test { List<List<Integer>> list2 = new ArrayList<List<Integer>>(); public static void main(String[] args) throws Throwable { Field f = Test.class.getDeclaredField("list2"); Type t = f.getGenericType(); if (t instanceof ParameterizedType) { t = getGenType((ParameterizedType)t); System.out.println(t); if (t instanceof Class) { ... } } } public static Type getGenType(ParameterizedType type) { //递归 Type t = type.getActualTypeArguments()[0]; if (t instanceof ParameterizedType) { t = getGenType((ParameterizedType)t); } return t; } }
List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
怎么得到Integer.class,
for example
import java.lang.reflect.*;
public class Test {
List<Integer> list = new ArrayList<Integer>();
public static void main(String[] args) throws Throwable {
Field f = Test.class.getDeclaredField("list"); //成员变量
Type t = f.getGenericType();
if (t instanceof ParameterizedType) { //可以获得Integer
System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
} List<String> slist = new ArrayList<String>(); //局部变量不能获取String
System.out.println(slist.getClass().getTypeParameters()[0].getName());
t = slist.getClass().getGenericSuperclass(); //通过超类也不行
if (t instanceof ParameterizedType) {
System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
}
t = slist.getClass().getGenericInterfaces()[0]; //通过超接口也不行
if (t instanceof ParameterizedType) {
System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
}
}
}
List<List<Integer>> list2 = new ArrayList<List<Integer>> ();List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
Type type =list2.getClass().getGenericSuperclass();
ParameterizedType gtype =(ParameterizedType) type;
if (gtype instanceof ParameterizedType) {
// list the raw type information
ParameterizedType ptype = (ParameterizedType)gtype;
Type rtype = ptype.getRawType();
System.out.println("rawType is instance of " +
rtype.getClass().getName());
System.out.println(" (" + rtype + ")");
// list the actual type arguments
Type[] targs = ptype.getActualTypeArguments();
System.out.println("actual type arguments are:");
for (int j = 0; j < targs.length; j++) {
System.out.println(" instance of " +
targs[j].getClass().getName() + ":");
System.out.println(" (" + targs[j] + ")");
}
} else {
System.out.println
("getGenericType is not a ParameterizedType!");
}我这样写不能获取到Integer.class
List<Integer> a = new ArrayList<Integer> ();
a.add(1);
List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
list2.add(a);
System.out.println(list2.get(0).get(0).getClass().getName());
public class Test {
List<List<Integer>> list = new ArrayList<List<Integer>>();
public static void main(String[] args) throws Throwable {
Field f = Test.class.getDeclaredField("list"); // 成员变量
Type t = f.getGenericType();
if (t instanceof ParameterizedType) {
Type type = ((ParameterizedType) t).getActualTypeArguments()[0];
if (type instanceof ParameterizedType) {
Type integerType = ((ParameterizedType) type).getActualTypeArguments()[0];
System.out.println(((Class<?>)integerType).getName());
}
}
}
}
List<List<Integer>> list2 = new ArrayList<List<Integer>> (); //成员变量public void check() throws Throwable {
Type type = this.getClass().getDeclaredField("list2").getGenericType();
if (type instanceof ParameterizedType) {
// list the raw type information
ParameterizedType ptype = (ParameterizedType)type;
String clsName = ptype..getActualTypeArguments()[0].toString();
if (clsName.matches(".*?<.*?>")) {
clsName = clsName.replaceAll(".*?<(.*?)>", "$1");
}
System.out.println(clsName);
Class c = class.forName(clsName);
...
} else {
System.out.println
("getGenericType is not a ParameterizedType!");
}
}
List<List<Integer>> list2 = new ArrayList<List<Integer>>();
public static void main(String[] args) throws Throwable {
Field f = Test.class.getDeclaredField("list2");
Type t = f.getGenericType();
if (t instanceof ParameterizedType) {
t = getGenType((ParameterizedType)t);
System.out.println(t);
if (t instanceof Class) {
...
}
}
} public static Type getGenType(ParameterizedType type) { //递归
Type t = type.getActualTypeArguments()[0];
if (t instanceof ParameterizedType) {
t = getGenType((ParameterizedType)t);
}
return t;
}
}