美文网首页
Java 得到泛型中得到T.class

Java 得到泛型中得到T.class

作者: 孤城少年说 | 来源:发表于2017-10-08 11:14 被阅读0次

转载自:http://www.cnblogs.com/onlysun/p/4539472.html

Class entityClass = (Class ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

getGenericInterfaces()和getGenericSuperclass()

getInterfaces()和getSuperclass()

先来看看这两个方法都是干什么用的:

1. public Type getGenericSuperclass()

用来返回表示当前Class所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果这个直接超类是参数化类型的,则返回的Type对象必须明确反映在源代码中声明时使用的类型。比如:

importjava.lang.reflect.ParameterizedType;publicclassGT1extendsGT2{publicstaticvoidmain(String[] args) {

System.out.println(((ParameterizedType)newGT1().getClass().getGenericSuperclass()));

}

}

则输出结果即为:

GT2

如果此Class代表的是Object类、接口、基本类型或 void,则返回 null。。如果此对象表示一个数组类,则返回表示Object类的Class对象。

2. public Type[] getGenericInterfaces()

与上面那个方法类似,只不过Java的类可以实现多个接口,所以返回的Type必须用数组来存储。

以上两个方法返回的都是Type对象或数组,在我们的这个话题中,Class都是代表的参数化类型,因此可以将Type对象Cast成ParameterizedType对象。而 ParameterizedType对象有一个方法, getActualTypeArguments()。

public Type[] getActualTypeArguments()

用来返回一个Type对象数组,这个数组代表着这个Type声明中实际使用的类型。接着使用上面的例子:

importjava.lang.reflect.ParameterizedType;publicclassGT1extendsGT2{publicstaticvoidmain(String[] args) {

System.out.println(((ParameterizedType)newGT1().getClass().getGenericSuperclass()).getActualTypeArguments()[0]);

}

}

这次的显示结果将是:class java.lang.Integer

因此,我们可以通过继承+反射的方法,来的到T.class。

需要说明的是,江南白衣使用的方法是将关键语句

Class < T >  entityClass  =  (Class < T > ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];

放在了超类,也就是声明泛型的那个类的构造方法中。这样一来,子类在继承具有泛型的超类时,会自动调用超类的构造方法。在此超类的构造方法中,调用的getClass返回的是子类的Class类型(与通常的重写机制有悖,呵呵,有待深究,但测试结果确是如此),则在子类中就无需再显式地使用getGenericInterfaces()和getGenericSuperclass()等方法了。

接着,再使用(Class)对 getActualTypeArguments()返回的元素做casting,即可得到所谓的T.class。

原文地址http://blog.csdn.net/gengv/article/details/5178055

好记性不如烂笔头,内存虽快,但不持久

相关文章

  • Java 得到泛型中得到T.class

    转载自:http://www.cnblogs.com/onlysun/p/4539472.html Class ...

  • JAVA泛型的理解

    泛型大家都接触的不少,但是由于Java历史原因,Java中泛型一直被称为伪泛型,因此对Java中的泛型,有很多不注...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • Kotlin 泛型

    Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类: 泛型函数: 类型变异 Java 的泛型中,最难理...

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • 15、泛型常用特点

    泛型常用特点 泛型是Java SE 1.5之后的特性,《Java 核心技术》中对泛型的定义是: “泛型” 意味着编...

  • java 泛型解析

    Java 泛型 1、泛型的精髓是什么 2、泛型方法如何使用 概述: 泛型在java中具有重要地位,在面向对象编程模...

  • 泛型中 ? super T和 ? extends T的区别

    首先, 说到 Java 的泛型, 我们必须要提到的是Java 泛型的类型擦除机制: Java中的泛型基本上都是在编...

  • Java 泛型

    一、概述 1.1 什么是Java泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型...

网友评论

      本文标题:Java 得到泛型中得到T.class

      本文链接:https://www.haomeiwen.com/subject/gqdeyxtx.html