您的位置:首页 > 编程语言 > Java开发

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

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

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

public class Parent<T> {

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

}
}


public class Child_A extends Parent<A> {

public static void main(String[] args){
Child_A cA = new Child_A();

//对于子类对父类useT方法的调用,需要父类中能得到子类继承时传入的泛型中的具体类<A>
cA.useT();

}
}


public class Child_B extends Parent<B>{

public static void main(String[] args){
Child_B cB= new Child_B();

//对于子类对父类useT方法的调用,需要父类中能得到子类继承时传入的泛型中的具体类<B>
cB.useT();

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

public class Parent<T> {

protected Class clazz;

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

this.clazz = (Class)pt.getActualTypeArguments()[0]; //因为<A,B,C>泛型中可带多个类型,故一个时为[0]
}

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

}
}
如上,添加了Parent的构造方法,当子类在实例化时会先实例化父类的构造方法,而构造方法中利用this.getClass().getGenericSuperclass()就可以获得此时父类实现的具体泛型。就可以实现在父类的方法中动态的对不同子类泛型实现处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息