Java反射---getGenericSuperclass和ParameterizedType参数化类型的获取

 在OA项目开发中中遇到了一个问题:父类 Class 父类 () 的泛型 T 类型,面对在不同子类具体继承,如何实现在父类方法中对泛型型T 的动态调用。--表达有点拗口,看下面例子。

具体事例如下:(伪代码)

public class Parent {

	//该方法是为了模拟对 T调用
	public Object useT(){
		/**
		 * 举例如:在 hibernate 的事务中调用删除get方法时
		 * 其中get(Class arg0, Serializable arg1)
		 */
		int id = 1;
		/**
		 * 由于 T 不是一个具体的类,故不能当做参数直接传入,那如何定位到子类具体继承传入的类呢? 
		 * 符号'?'表示不知道传入什么类
		**/
		return (T)SessionFactory.getCurrentSession().get(?,id);
		
	}
}

public class Child_A extends Parent {
	
	public static void main(String[] args){
	Child_A cA = new Child_A();
	
	//对于子类对父类useT方法的调用,需要父类中能得到子类继承时传入的泛型中的具体类
	cA.useT();
	
	}
}

public class Child_B extends Parent{
	
	public static void main(String[] args){
		Child_B cB= new Child_B();
		
		//对于子类对父类useT方法的调用,需要父类中能得到子类继承时传入的泛型中的具体类
		cB.useT();
			
		}
}
其中A,B分别为两个实体类。

遇到如上的情况我们该如何定位子类的类型呢?实现如下 由于jdk 5之后增加了泛型,故提供了一个getGenericSuperclass()方法,通过反射机制来获取“带有泛型的父类。

public class Parent {
	
	protected Class clazz;
	
	//利用默认构造函数,当子类实例化时会先调用父类的构造方法。
	protected Parent(){
		//注意  this.getClass() ==具体实例的子类,而不是父类。
		//ParameterizedType继承Type.
		//Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
		ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();
		
		this.clazz = (Class)pt.getActualTypeArguments()[0]; //因为泛型中可带多个类型,故一个时为[0]
	}

	//该方法是为了模拟对 T调用
	public Object useT(){
		/**
		 * 举例如:在 hibernate 的事务中调用删除get方法时
		 * 其中get(Class arg0, Serializable arg1)
		 */
		int id = 1;
		/**
		 * 由于 T 不是一个具体的类,故不能当做参数直接传入,那如何定位到子类具体继承传入的类呢? 
		 * 符号'?'表示不知道传入什么类
		**/
		return (T)SessionFactory.getCurrentSession().get(?,id);
		
	}
}
如上,添加了Parent的构造方法,当子类在实例化时会先实例化父类的构造方法,而构造方法中利用this.getClass().getGenericSuperclass()就可以获得此时父类实现的具体泛型。就可以实现在父类的方法中动态的对不同子类泛型实现处理。



你可能感兴趣的:(Java语言学习)