`

Java学习 之 使用反射来获取泛型信息

阅读更多

    通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰。获得了Field对象后,就可以很容易的获得该Field的数据类型,例如,下面的代码便是获得该Field对象foeld的类型:

    Class<?> type = field.getType();

    但是通过这种方式只对普通类型的Field有效,如果该Field的类型是有泛型限制的类型,如Map<String,Integer>类型,则不能准确得到该Field的泛型参数。

    为了获得指定Field的泛型类型,应该使用如下方法来获取指定Field的泛型类型:

    Type type = field.getGenericType();

    然后将Type对象强制类型转换成ParameterizedType对象,ParameterizedType代表被参数化的类型,也就是增加了泛型限制的类型,ParameterizedType类提供了两个方法:

    getRawType();返回被泛型限制的类型;

    getActualTypeArguments();返回泛型参数类型。

 

下面,我们来看一个完整的例子,方便大家掌握:

 

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;


public class GenericTest {
	
	private Map<String , Integer> map = new HashMap<String, Integer>();
	
	public static void main(String[] args) throws SecurityException, NoSuchFieldException {
		// 获取Class实例
		Class<GenericTest> class1 = GenericTest.class;
		// 根据属性名取得该属性对应的Field对象
		Field mapField = class1.getDeclaredField("map");
		// 示范第一个方法:直接通过getType()取出Field的类型,只对普通类型的Field有效
		Class<?> class2 = mapField.getType();
		// 输出查看
		System.out.println("属性名为map的属性类型为:"+class2);
		
		// 示范第二种方法:
		Type mapMainType = mapField.getGenericType();
		// 为了确保安全转换,使用instanceof
		if (mapMainType instanceof ParameterizedType) {
			// 执行强制类型转换
			ParameterizedType parameterizedType = (ParameterizedType)mapMainType;
			// 获取基本类型信息,即Map
			Type basicType = parameterizedType.getRawType();
			System.out.println("基本类型为:"+basicType);
			// 获取泛型类型的泛型参数
			Type[] types = parameterizedType.getActualTypeArguments();
			for (int i = 0; i < types.length; i++) {
				System.out.println("第"+(i+1)+"个泛型类型是:"+types[i]);
			}
		} else {
			System.out.println("获取泛型类型出错!");
		}
	}
	
}

 

分享到:
评论

相关推荐

    Java试题-3:反射和泛型的综合应用

    Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术

    java 基于泛型与反射的通用 DAO

    反射是Java提供的一个强大的工具,允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作。在实现通用DAO时,反射通常用于动态调用数据库操作的方法,比如SQL查询。例如,在`UsersDAO.java`中,...

    Java使用反射来获取泛型信息示例

    通过这个实例,我们可以看到,使用Java反射机制来获取泛型信息是非常方便的,只要我们使用ParameterizedType对象来获取泛型参数的信息。同时,我们也可以看到,使用反射机制可以获取到类中的字段、方法和构造函数等...

    myreflect.rar 反射和泛型使用源码

    总的来说,Java反射提供了运行时的动态能力,而泛型则在编译时提高了类型安全性。结合使用,开发者可以构建更加灵活且安全的系统。通过学习和实践压缩包中的源代码,你将能够更熟练地运用这两个工具解决实际问题。

    Java泛型的用法及T.class的获取过程解析

    2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型转换的代码。 4. MetaProgramming:泛型可以在编译期搞很多东西,比如MetaProgramming。 ...

    JAVA5泛型和反射

    泛型主要是为了解决在编程中频繁进行类型转换的问题,而反射则允许程序在运行时动态地获取类的信息和调用方法。 泛型类型: 在 Java 5 之前,像 `Hashtable` 这样的集合类只能存储 `Object` 类型的数据,这意味着在...

    java反射与泛型综合例子

    Java反射和泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的功能,并且在特定情况下可以相互结合使用。本文将深入探讨这两个概念,并通过一个具体的`Testrefl.java`示例来阐述它们的应用。 Java反射...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试复杂的Java应用程序尤其有用。 首先,我们来理解什么是反射。在Java中,类、接口和方法等都是由类对象表示的,这些类...

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    Java-Java反射与泛型教程

    在学习Java反射和泛型时,理解它们的概念和使用场景是非常重要的。反射提供了一种动态操控程序的能力,常用于框架开发、插件系统、元数据处理等。而泛型则提高了代码的可读性和安全性,减少了类型转换的工作。结合...

    Java反射泛型,实现数据库的动态增删改查等功能

    具体实现时,我们可以为每个数据库操作创建一个泛型方法,使用反射获取实体类的字段,根据字段生成对应的SQL语句片段。比如在插入操作中,我们可以遍历`T`的所有字段,构建一个`INSERT INTO table_name (field1, ...

    反射处理java泛型

    当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息。这是本文将要介绍的ReflectionUtil是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的...

    泛型 反射 相关概念方法使用

    泛型和反射是Java编程语言中的两个重要特性,它们各自有着独特的功能,但在某些场景下也可以结合使用。本文将深入探讨这两个概念以及相关的使用方法。 首先,我们来了解泛型。泛型是Java 5引入的一项特性,它允许在...

    java 泛型方法使用示例

    这也就意味着你不能在运行时通过反射获取到泛型的具体类型信息。 **七、总结** Java 泛型方法提供了编写高效、类型安全代码的能力,使得代码更易于理解和维护。通过正确地使用泛型方法,我们可以避免运行时错误,...

    反射处理java泛型_.docx

    Java反射机制是Java语言的一个重要特性,它允许运行时访问类、接口、字段和方法的信息,包括私有成员。在处理泛型时,由于Java的类型擦除,直接使用常规方式无法获取到泛型参数的具体类型。这时,就需要借助反射来...

    java反射之通过反射了解集合泛型的本质(详解)

    这段代码使用反射获取 `ArrayList&lt;String&gt;` 的 `add` 方法,并传入 `Object.class` 作为参数类型,然后调用该方法将整数20添加到 `list2` 中。虽然这在编译时会报错,但通过反射,我们能够在运行时添加任何类型的...

    反射泛型

    如果方法的参数类型是泛型,我们可以根据反射获取的参数类型信息进行正确传递。 3. **访问字段**:通过`Class.getField()`或`Class.getDeclaredField()`获取字段对象,然后使用`get()`或`set()`方法读写字段值。...

    博客《反射(2):泛型相关周边信息获取》对应源码

    源码文件 `&lt;反射(2):泛型相关周边信息获取&gt;` 可能包含示例代码,演示了如何通过反射获取和操作泛型类和接口的实例。通过阅读和学习这段代码,开发者可以更深入地理解反射和泛型的交互,提升在实际项目中的应用...

    Java泛型_Java中的泛型结构_

    - 如果需要在运行时获取泛型信息,可以使用 `getGenericSuperclass()` 或 `getGenericInterfaces()` 等方法,但通常需谨慎处理。 总的来说,Java泛型为开发者提供了更高级别的抽象,提高了代码的清晰度、类型安全...

    java泛型反射注解

    先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...

Global site tag (gtag.js) - Google Analytics