`
zxl10059
  • 浏览: 57941 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

通过反射获得泛型的实际类型参数

    博客分类:
  • J2SE
阅读更多
Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。
package com.zhiming.tree;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;
//E为任意参数类型,在类名中加<E>可起到控制类中方法参数使用,和方法返回值的类型统一
public class ProductDao<E>
{

	public void add(E x)
	{
		
	}
	public void delete(E x)
	{

	}

	public E findByCondition(String name)
	{
		return null;
	}
	public static void applyVector(Vector<Date>  v1)
	{
		
	}
	public static void main(String[] args) throws SecurityException, NoSuchMethodException
	{
		Vector<Date>  v1=new Vector<Date>();
		//无法直接通过反射获得vector<Date>泛型的参数类型,只有通过方法去获得
		Method method=ProductDao.class.getMethod("applyVector", Vector.class);
		Type[] types = method.getGenericParameterTypes();
		ParameterizedType paratype=(ParameterizedType)types[0];
		System.out.println(paratype.getRawType());
		System.out.println(paratype.getActualTypeArguments()[0]);
	}
	
}
分享到:
评论

相关推荐

    反射与泛型

    假设我们已经得到了T的实际类型,我们可以使用`Class.newInstance()`方法或`Constructor.newInstance()`来创建对象。但要注意,`Class.newInstance()`方法要求类必须有无参构造器,而`Constructor.newInstance()`则...

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

    泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao&lt;T&gt; { public...

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

    1. **类型参数**:定义泛型类或接口时,使用尖括号`&lt;T&gt;`表示类型参数,T是占位符,代表任意类型。 2. **通配符**:如`?`,表示未知类型,常用于方法参数,提供更大的灵活性。 3. **边界**:`&lt;T extends SomeClass&gt;`...

    反射泛型

    如果类具有泛型参数,我们可以使用反射来获取实际的泛型类型,从而更好地理解实例化的对象。 2. **动态调用方法**:使用`Class.getMethod()`或`Class.getDeclaredMethod()`获取方法对象,然后调用`invoke()`方法...

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

    泛型是Java 5引入的一项特性,它允许在定义类、接口和方法时指定类型参数,以增强代码的类型安全性和可读性。通过使用泛型,我们可以限制容器(如集合)中存储的元素类型,避免在运行时进行强制类型转换,并减少潜在...

    JAVA5泛型和反射

    Java 泛型还支持类型参数的边界,比如 `T extends SomeClass`,这样可以限制类型参数必须是 `SomeClass` 或其子类。例如,`List&lt;String&gt; list = new ArrayList();` 中的 `List&lt;String&gt;` 指定了列表元素只能是字符串...

    Java泛型类型擦除后的补偿

    - 反射API在泛型类型擦除后仍然能获取到泛型信息,这主要通过泛型类的类型参数的实际类型参数化实例(TypeToken)来实现。 - 这使得在运行时可以进行一些泛型相关的操作,如创建参数化的类实例。 总结来说,Java...

    Java-Java反射与泛型教程

    1. **泛型类**: 定义泛型类时,可以使用尖括号来声明类型参数,如`class Container&lt;T&gt;`,T称为类型参数,代表一种未知类型。 2. **类型擦除**: 泛型在编译后会进行类型擦除,因此在运行时无法直接获取泛型类型信息...

    黑马程序员----泛型与反射的小运用

    泛型的基本语法是在类、接口或方法声明前加上尖括号`&lt;&gt;`,并在其中指定一个或多个类型参数。例如,一个简单的泛型列表类可以定义为`List&lt;T&gt;`,其中`T`就是类型参数,代表任意类型。使用泛型,我们可以创建一个能够...

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

    这些方法返回的是 `Type` 接口的实现,如 `ParameterizedType`,`WildcardType` 等,它们包含了关于泛型的实际类型参数。 `ParameterizedType` 接口表示参数化的类型,它有一个重要的方法 `getActualTypeArguments...

    反射泛型完美版分页.rar

    本资源"反射泛型完美版分页.rar"似乎提供了一个结合了这两种特性的分页解决方案,特别适用于处理大量数据的情况。下面我们将详细探讨反射、泛型以及它们如何应用于分页。 首先,让我们理解什么是反射。反射是Java的...

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

    Java反射和泛型是两种强大的编程特性,它们在开发中有着广泛的应用,特别是在数据库操作的动态化场景下。本文将详细介绍如何结合这两种技术实现在Java中对MySQL、SQL Server或Oracle数据库进行动态的增删改查操作。 ...

    深入分析JAVA 反射和泛型

    在 JAVA 中,泛型是通过使用类型参数来实现的。类型参数是指在泛型中使用的类型变量,例如 `&lt;T&gt;`。类型参数可以用来指定类型的边界,从而限制类型的使用范围。 使用泛型来限制 Class 类 从 JDK5 以后,Java 的 ...

    java反射与泛型综合例子

    泛型允许我们在定义类、接口和方法时指定类型参数,使得容器能够保存特定类型的元素,编译器会进行类型检查,防止插入不兼容的数据。例如,`List&lt;String&gt;`就是一个泛型列表,只能存放字符串。 泛型的使用包括定义...

    C#泛型、反射实例、自动生成sql语句

    泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的类型转换。这提高了代码的复用性和安全性。在C#中,我们可以定义泛型类、泛型接口、泛型方法等。例如,...

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

    我们不能直接获取`myList`的泛型类型`T`,但我们可以通过以下方式获取其实际类型参数: ```java Field field = Class.forName("my.package.ParentClass").getDeclaredField("myList"); Type genericType = field....

    反射泛型序列化(.net版)PPT

    它们允许在类、接口和方法中定义类型参数,从而创建可重用的代码模板。泛型的主要优点包括: 1. **类型安全**:泛型确保了在编译时的类型检查,防止了类型转换错误。 2. **性能优化**:泛型避免了装箱和拆箱操作,...

    基于泛型与反射的万能数据库操作代码

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们在开发...在实际应用中,可能还需要考虑更多的细节,比如事务管理、错误处理以及性能优化等,但这个基础框架已经足够展示泛型与反射在数据库操作中的强大功能。

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

    最后,我们使用`getActualTypeArguments()`方法获取Type对象中的实际类型参数,然后将其强制转换为Class对象。 四、泛型的使用场景 泛型可以应用于多种场景中,例如: * 集合框架:泛型可以用于集合框架中,例如...

    C#通过反射创建自定义泛型

    // 将泛型类型参数替换为实际类型 foreach (Type arg in typeArgs) { typeName = typeName.Replace("`", "[" + arg.FullName + ", " + arg.Assembly.FullName + "]"); } // 使用反射创建实例 var o = ...

Global site tag (gtag.js) - Google Analytics