Class T{
List<A> a;
List<B> b;
}Class A {
}
Class B{
}
有这样一个需求:通过反射,获得class T中所有属性的实际类型。下面是我的代码:
Class<?> classType = Class
.forName("T");
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getType());
}但是执行结果是:
interface java.util.List
interface java.util.List
我想获得a和b的泛型类型,该如何实现?
List<A> a;
List<B> b;
}Class A {
}
Class B{
}
有这样一个需求:通过反射,获得class T中所有属性的实际类型。下面是我的代码:
Class<?> classType = Class
.forName("T");
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getType());
}但是执行结果是:
interface java.util.List
interface java.util.List
我想获得a和b的泛型类型,该如何实现?
解决方案 »
- 请问怎么给一个SSL网站发送客户端证书
- Hibernate+Struts+spring整合问题
- 高分求:HQL如何实现乘法
- EJB 和 Spring 区别
- 请问个问题,net/sf/navigator/menu/MenuRepository在哪个jar包里面,那能下载?
- 问个UltraEdit中正则表达式的问题?
- spring 调用mssql存储过程 怎么取返回值,sos~~~
- JAVA应用问题(二)
- 500分请教struts问题
- Tomcat配置文件Server.xml中加入AJP13的问题
- Quartz cluster scheduler job not fire
- json的一个输出模版插件问题
多谢。
docs.oracle.com/javase/tutorial/java/generics/erasure.html
Class<?> classType = Class.forName("csdn$TAB");
for (Field field : classType.getDeclaredFields()) {
Class<?> c = field.getType(); //获得属性的类型
for (TypeVariable tv : c.getTypeParameters()) { //获得属性类型的泛型参数信息
System.out.println(tv);
System.out.println(tv.getBounds()[0]); //泛型的类型
}
}
反射这种方式实例化可能与它有某种程度上的联系
http://tutorials.jenkov.com/java-reflection/generics.html
http://www.jquantlib.org/index.php/Using_TypeTokens_to_retrieve_generic_parameters至于为什么Reflection可以获取到Generics Information,没有说清楚,粗略地理解的话,可能就是javac有针对性地作了特殊处理。
for (Field field : classType.getDeclaredFields()) {
Class<?> c = field.getType(); // 获得属性的类型
for (TypeVariable tv : c.getTypeParameters()) { // 获得属性类型的泛型参数信息
System.out.println(tv);
System.out.println(tv.getBounds()[0]); // 泛型的类型
}
}
运行了一下,结果如下,以为会得到A...B....E
class java.lang.Object
E
class java.lang.Object
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;public class T {
public List<A> a;
List<B> b; public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException {
Field field = T.class.getField("a"); Type genericFieldType = field.getGenericType();
if(genericFieldType instanceof ParameterizedType){
ParameterizedType aType = (ParameterizedType) genericFieldType;
Type[] fieldArgTypes = aType.getActualTypeArguments();
for(Type fieldArgType : fieldArgTypes){
Class fieldArgClass = (Class) fieldArgType;
System.out.println("fieldArgClass = " + fieldArgClass);
}
}
}
}class A {
}class B {
}
fieldArgClass = class A
Class<?> classType = Class.forName("T");
for (Field field : classType.getDeclaredFields()) {
Type ft = field.getGenericType();
if (ft instanceof ParameterizedType) {
for (Type fpt : ((ParameterizedType)ft).getActualTypeArguments()) {
System.out.println(fpt);
}
}
}不过这样只能针对集合类型的泛型定义的属性,如果是直接泛型定义的属性是取不到的(只能取到Object),如
class T<E> {
E a;
}...
T<String> t = new T<String>();
//反射获取t的a属性的类型,是取不到String的