Java反射---getGenericSuperclass和ParameterizedType参数化类型的获取
2016-04-11 23:16
429 查看
在OA项目开发中中遇到了一个问题:父类 Class 父类 <T> () 的泛型 T 类型,面对在不同子类具体继承,如何实现在父类方法中对泛型型T 的动态调用。--表达有点拗口,看下面例子。
具体事例如下:(伪代码)
遇到如上的情况我们该如何定位子类的<T>类型呢?实现如下 由于jdk 5之后增加了泛型,故提供了一个getGenericSuperclass()方法,通过反射机制来获取“带有泛型的父类。
具体事例如下:(伪代码)
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()就可以获得此时父类实现的具体泛型。就可以实现在父类的方法中动态的对不同子类泛型实现处理。
相关文章推荐
- jackson、Gson反序列化 泛型
- Java反射随记
- JAVA泛型—— 3fe8 转
- JAVA泛型详解——转
- AS3中的反射(速记) 分析
- 编写高质量代码改善C#程序――使用泛型集合代替非泛型集合(建议20)
- 简单学习C#中的泛型方法使用
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- C#泛型用法实例分析
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- C语言泛型编程实例教程
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C# 泛型的简单理解(安全、集合、方法、约束、继承)分享
- C#泛型Dictionary的用法实例详解
- C#利用反射技术实现去掉按钮选中时的边框效果
- C#泛型和反射实例解析
- python反射