黑马程序员技术交流社区
标题:
通过反射获取泛型
[打印本页]
作者:
liudh1
时间:
2016-4-24 07:46
标题:
通过反射获取泛型
package liu.dh.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
public class Demo5_GetGeneric {
/**
* @param args
* @throws ClassNotFoundException
* 重要内容:
* 获取泛型:通过反射, 获取本类泛型,获取父类泛型
* 获取本类泛型:
* 通过Class中TypeValariable[] getTypeParameters(),然后遍历数组,可得到本类泛型
*
* 获取父类泛型:
* 1.子类继承父类时父类添加了泛型:class Ts<Stu> extends Work<Stu>
* 1.先取得带泛型的父类:通过Type getGenericSuperClass();
* 2.使用(ParameterizedType)对Type对象向下转型,然后使用ParameterizedType中的
* Type[] getActualTypeArguments()方法,然后遍历数组,可得到父类泛型.
* 2.子类继承父类时父类未添加泛型:class Fish extends Creature
* 1.先取得带泛型的父类:通过Type getGenericSuperClass();
* 2.向下转型为Class对象,通过Class中TypeValariable[] getTypeParameters(),然后遍历数组,
* 可得到本类泛型
*
* 使用Class 中的getTypeParameters() 按声明顺序返回 TypeVariable 对象的一个数组,
* 这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。
* Type getGenericSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
* public interface ParameterizedTypeextends Type
* ParameterizedType 表示参数化类型,如 Collection<String>。
Type[] getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
//获取本类的泛型:
//获取Creature类泛型
Class<?> cla = Class.forName("liu.dh.reflect.Creature");
System.out.println(cla.getName());//liu.dh.reflect.Creature
@SuppressWarnings("rawtypes")
TypeVariable[]tty = cla.getTypeParameters();
for (TypeVariable<?> typeVariable : tty) {
System.out.println(typeVariable);//String
}
//获取Ts类的泛型
Ts<Object> ts = new Ts<>();
Class<? extends Ts> tsl =ts.getClass();
TypeVariable<?>[] TY = tsl.getTypeParameters();
for (TypeVariable<?> typeVariable : TY) {
System.out.println(typeVariable);//stu
}
System.out.println(tsl.getName());//liu.dh.reflect.Ts
//获取父类泛型:
//class Ts<Stu> extends Work<Stu>,继承时父类添加泛型,才能使用ParmmeterizedType
//如果父类未添加泛型<Stu>,侧只能使用TypeParameters();
//获取带泛型的父类:继承父类时class Ts<Stu> extends Work<Stu>父类添加泛型
Type type2=tsl.getGenericSuperclass();
System.out.println(type2);
System.out.println(type2 instanceof ParameterizedType);
ParameterizedType tys = (ParameterizedType)type2;
Type[]tt = tys.getActualTypeArguments();
for (Type type : tt) {
System.out.println(type);
}
//获取带泛型的父类
Class<?> clazz = Class.forName("liu.dh.reflect.Fish");
Type types = clazz.getGenericSuperclass();
System.out.println(types);
//获取父类的泛型:继承父类时class Fish extends Creature,父类未添加泛型
System.out.println(types instanceof Class);
Class<?> class1 = (Class<?>)types;//向下转型Class implements Type;
TypeVariable[]ty = class1.getTypeParameters();
System.out.println(ty[0].getName());//String
//向下转型问题
Creature<?> aCreature= new Creature<Object>();
System.out.println(aCreature instanceof Fish);//false
Creature<?> creature = new Fish();
System.out.println(creature instanceof Fish);//true
//Fish fish = (Fish)aCreature;//向下转型错误
System.out.println(types instanceof Class);
System.out.println(types instanceof ParameterizedType);
//ParameterizedType type1= (ParameterizedType)types;//向下转型错误
//Type[]types2 = type1.getActualTypeArguments();
//System.out.println(((Class<?>)types2[0]).getName());
//获取父类
Class<?> class2 = clazz.getSuperclass();
System.out.println(class2.getName());
//获取字段类型
Field[] field =clazz.getDeclaredFields();
for (Field field2 : field) {
Type type = field2.getGenericType();
System.out.println(((Class<?>) type).getName());
}
}
}
作者:
liuchenguangqnm
时间:
2016-4-24 08:17
有时间好好看看,谢谢
作者:
liudh1
时间:
2016-4-24 08:23
努力吧,加油!
作者:
liudh1
时间:
2016-4-24 08:25
加油,奋斗吧
作者:
木辰
时间:
2016-4-24 09:08
这个必须要好好看看。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2