`
Josh_Persistence
  • 浏览: 1649830 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Java获取泛型参数的类型的方法 - 实例讲解

    博客分类:
  • Java
阅读更多

        在Java中,我们常常需要获取泛型参数的类型,比如将使用了泛型的Java代码进行序列化和反序列化的时候。

 

 

一、在开始试图去获取泛型参数的类型前,可以试着去执行如下的类,看看执行的结果:

/**
 * 
 */
package com.wsheng.aggregator.generic;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 
 * @author Josh Wang(Sheng)
 * 
 * @email  swang6@ebay.com
 * 
 */
public class GenericTest<T> {
	
	public static void main(String[] args) {
		GenericTest<String> test = new GenericTest<String>(){}; // 匿名内部类的声明在编译时进行,实例化在运行时进行
		
		Type typeClass1 = test.getClass().getGenericSuperclass();
		System.out.println(typeClass1);
		
		if (typeClass1 instanceof ParameterizedType) {
			Type actualType1 = ((ParameterizedType)typeClass1).getActualTypeArguments()[0];
			
			System.out.println(actualType1);
		} else {
			System.out.println(typeClass1 + " is Not ParameterizedType");
		}
		
		System.out.println(" ==================================== ");
		
		GenericTest<String> test2 = new GenericTest<String>(); // 所有的泛型类型在运行时都是Object类型
		Type typeClass2 = test2.getClass().getGenericSuperclass();	
		System.out.println(typeClass2);
		
		if (typeClass2 instanceof ParameterizedType) {
			Type actualType2 = ((ParameterizedType)typeClass2).getActualTypeArguments()[0];
			
			System.out.println(actualType2);
		} else {
			System.out.println(typeClass2 + " is Not ParameterizedType");
		}
		
	}

}

 

执行的结果是:

 

com.wsheng.aggregator.generic.GenericTest<java.lang.String>
class java.lang.String
 ==================================== 
class java.lang.Object
class java.lang.Object is Not ParameterizedType

 

从执行的结果可以清晰的看到, 使用匿名内部类的方式可以成功的获取到泛型参数的类型,而直接定义的类对象并不能获取到泛型参数的类型,看完下面的介绍便知道根本原因。

 

二、Java的泛型机制

       Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)

 

三、Class类的getGenericSuperClass()方法解读:

       Class的该方法,对于带有泛型的class,返回一个ParameterizedType对象,对于Object、接口和原始类型返回null,对于数组class则是返回Object.class。ParameterizedType是表示带有泛型参数的类型的Java类型,JDK1.5引入了泛型之后,Java中所有的Class都实现了Type接口,ParameterizedType则是继承了Type接口,所有包含泛型的Class类都会实现这个接口。

       注意,实际运用中还要考虑比较多的情况,比如获得泛型参数的个数避免数组越界等。

 

 四、匿名子类又是如何获取到具体的泛型类型?

       这要依赖Java的Class字节码中存储的泛型参数信息。如前面所说,Java的泛型机制虽然在运行期间泛型类和非泛型类都相同(都是Object),但是编译java源代码生成的Class文件中还是保存了泛型相关的信息,这些信息被保存在class字节码常量池中,使用了泛型的代码处会生成一个signature签名字段,该签名signature字段指明了这个常量池的地址,于是可从该常量池中获取到具体的类型。

1
0
分享到:
评论

相关推荐

    实例讲解Java泛型编程的快速入门

    - Java泛型在编译后会进行类型擦除,这意味着在运行时,所有的泛型类型信息都会被替换为它们的边界类型或`Object`。因此,泛型并不改变对象的实际类型,仅在编译时提供类型检查。 6. **泛型与集合** - Java集合...

    java泛型实例讲解代码.rar

    通过阅读和理解`java泛型实例讲解代码`中的代码,你可以深入学习如何在实际编程中应用这些概念,以及它们如何提升代码的健壮性和可维护性。这个压缩包可能包含了各种示例,如泛型类、泛型方法、边界限制等,通过这些...

    java 泛型的使用 详细讲解

    ### Java泛型的使用详细讲解 #### 一、引言 在Java开发中,泛型是一种重要的语言特性,它能够帮助开发者在不增加代码量的情况下处理多种数据类型,同时还能保持代码的清晰度和可读性。本文将详细介绍Java泛型的...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    定义泛型类:展示如何定义一个简单的泛型类,以及如何创建该类的实例并使用泛型参数。 泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,...

    详细讲解Java的泛型

    Java的泛型是一种强大的工具,它允许我们在编程时指定容器(如类、接口或方法)可以操作的数据类型。这样做的好处在于,它提高了代码的类型安全性,减少了强制类型转换,并且在编译阶段就能捕获可能的类型错误,而...

    java泛型的内部原理及更深应用

    Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

    Java中的泛型方法详解及简单实例

    泛型方法是Java泛型系统的重要组成部分,它们提供了一种在方法级别实现类型参数化的方式,增强了代码的类型安全性、复用性和灵活性。理解并熟练掌握泛型方法,对于编写高质量、可维护的Java代码至关重要。希望本文...

    关于java泛型的讲解

    通过理解和熟练运用这些规则和特性,你可以更有效地利用Java泛型来编写安全、高效和可维护的代码。在实际开发中,泛型能够帮助你构建更加灵活的容器类,比如集合框架中的 `ArrayList&lt;T&gt;`、`HashMap, V&gt;` 等,它们都...

    java增删改查JDBC封装类(泛型封装)

    - 泛型是在编译时提供类型安全检查的一种机制,允许在类、接口和方法中使用类型参数,避免了强制类型转换的麻烦,提高了代码的可读性和安全性。 - 泛型类可以定义一个通用的数据类型T,实例化时可以指定具体的类型...

    java泛型初探

    通过以上讲解,我们可以看到Java泛型提供了强大的工具来处理类型安全,提高了代码的复用性和可读性。在“java泛型的高级用法demo”中,你可以期待更深入的示例,如限制类型参数、创建多级泛型、使用泛型接口等复杂...

    泛型编程小实例(以List为例)

    泛型编程是Java、C#等面向对象编程语言中的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而实现代码的复用并提供编译时的类型安全检查。本教程将以Java中的List接口为例,深入探讨泛型编程的概念、...

    java泛型学习全面页面下载资料

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了类型安全性和代码可读性。泛型允许我们在编写代码时指定容器(如集合)可以存储的数据类型,从而在编译阶段就能捕获...

    《Java程序设计实例教程》-毕广吉-电子教案

    - **泛型**:泛型引入了类型参数,提高了代码的类型安全性和重用性。 6. **多线程** - **Thread类与Runnable接口**:理解如何创建和管理线程,以及线程间的通信和同步。 - **线程状态**:了解线程的生命周期,...

    韩顺平java从入门到精通1-32课源码笔记

    《韩顺平java从入门到精通1-32课源码笔记》是一份全面而深入的Java学习资源,由知名讲师韩顺平精心讲解。这份资料涵盖了从Java基础到高级特性的全方位教学,旨在帮助初学者系统地掌握这门强大的编程语言。下面,我们...

    达内JAVA TTS5.0 PDF----JAVA语言基础

    10. **泛型**:Java泛型允许在定义类、接口和方法时指定参数类型,提高了代码的类型安全性和重用性。 11. **反射机制**:反射机制允许程序在运行时动态获取类的信息并调用其方法,是Java动态性的重要体现。 12. **...

    Java泛型:概念、用法与优势

    ### Java泛型:概念、用法与优势 #### 第一部分:简介和概念 在深入了解Java泛型的具体用法之前,我们需要先对泛型的基本概念有一个清晰的认识。泛型的引入主要是为了解决早期Java编程中遇到的一些问题。例如,在...

    Java语言程序设计教程--电子教案-2041

    2. **Java语法**:讲解基本的编程元素,如变量、数据类型(包括原始类型和引用类型)、运算符、控制结构(如if语句、switch、for循环、while循环)以及流程控制。 3. **类与对象**:阐述面向对象编程的基础,包括类...

    JAVA程序设计------

    这一章会讲解如何定义和调用方法,以及了解参数的按值传递和按引用传递的区别。 5. **第七章:面向对象高级特性** 在深入理解基础后,这一章可能包括抽象类、接口、内部类、枚举、访问控制修饰符等更高级的主题。...

Global site tag (gtag.js) - Google Analytics