看一下获取字段类型 http://java.sun.com/docs/books/tutorial/reflect/member/fieldTypes.html来自 Java 教程追踪:反射 API http://java.sun.com/docs/books/tutorial/reflect/.
基本上,你需要做的就是获得所有java.lang.reflect.Field http://java.sun.com/javase/6/docs/api/java/lang/reflect/Field.html你班级的并打电话Field#getType() http://java.sun.com/javase/6/docs/api/java/lang/reflect/Field.html#getType%28%29在他们每个人上(检查下面的编辑)。要得到all对象字段包括 public、protected、package 和 private 访问字段,只需使用Class.getDeclaredFields() http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getDeclaredFields%28%29。像这样的事情:
for (Field field : Person.class.getDeclaredFields()) {
System.out.format("Type: %s%n", field.getType());
System.out.format("GenericType: %s%n", field.getGenericType());
}
EDIT:正如所指出的wowest https://stackoverflow.com/users/49237/wowest在评论中,你实际上需要打电话Field#getGenericType() http://java.sun.com/javase/6/docs/api/java/lang/reflect/Field.html#getGenericType%28%29,检查是否返回Type http://java.sun.com/javase/6/docs/api/java/lang/reflect/Type.html is a ParameterizedType
然后相应地获取参数。使用ParameterizedType#getRawType() http://java.sun.com/javase/6/docs/api/java/lang/reflect/ParameterizedType.html#getRawType%28%29 and ParameterizedType#getActualTypeArgument() http://java.sun.com/javase/6/docs/api/java/lang/reflect/ParameterizedType.html#getActualTypeArguments%28%29获取 a 的原始类型和类型参数的数组ParameterizedType
分别。下面的代码演示了这一点:
for (Field field : Person.class.getDeclaredFields()) {
System.out.print("Field: " + field.getName() + " - ");
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
System.out.print("Raw type: " + pType.getRawType() + " - ");
System.out.println("Type args: " + pType.getActualTypeArguments()[0]);
} else {
System.out.println("Type: " + field.getType());
}
}
并会输出:
Field: name - Type: class java.lang.String
Field: children - Raw type: interface java.util.List - Type args: class foo.Person