`
lxtc2014
  • 浏览: 11058 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于Java如何读取泛型类型参数

阅读更多
一般使用反射来获取泛型类型信息
如下代码:
package myGenetic;

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

public class GenericTest {
	/*使用反射来获取泛型信息*/
	private Map<String, Integer> score;
	public static void main(String[] args) throws SecurityException, NoSuchFieldException {
		//Class clazz = GenericTest.class;
		Class<GenericTest> clazz = GenericTest.class;
		//System.out.println(clazz);
		Field f = clazz.getDeclaredField("score");
		
		//直接使用getType只对普通类型有效,无法取到泛型参数
		Class<?> a = f.getType();
		System.out.println("score的类型是:"+a);
		
		//获得Field实例f的泛型类型
		Type gType = f.getGenericType();
		//如果gType类型是ParameterizedType的对象
		if (gType instanceof ParameterizedType) {
			ParameterizedType pType = (ParameterizedType) gType;
			//获取原始类型
			Type rType = pType.getRawType();
			System.out.println("原始类型是:"+rType);
			//取得泛型类型参数
			Type[] tArgs = pType.getActualTypeArguments();
			System.out.println("泛型类型是:");
			for (int i = 0; i < tArgs.length; i++) {
				System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);
			}
		}else{
			System.out.println("获取泛型类型出错!");
		}
	}
}


输出结果如下:
score的类型是:interface java.util.Map
原始类型是:interface java.util.Map
泛型类型是:
第0个泛型类型是:class java.lang.String
第1个泛型类型是:class java.lang.Integer


还有一个较好的例子,多用于实现BaseDAO,代码如下:
package myGenetic;

import java.lang.reflect.ParameterizedType;

class SubClass extends SuperClass<Person> {  
	  
    public SubClass() {  
        super();  
    }  
  
}  
  
class Person {  
    public Person() {  
        super();  
    }  
  
    public void function() {  
        System.out.println("function in Person.class...");  
    }  
}  


public abstract class SuperClass<T> {
	 private Class<T> clazz;
	 
	 @SuppressWarnings("unchecked")  
	    public SuperClass() {  
	        clazz = (Class<T>) ((ParameterizedType) super.getClass()  
	                .getGenericSuperclass()).getActualTypeArguments()[0];
	    }  
	  
	    public Class<T> getClazz() {  
	        return clazz;  
	    }  
	  
	    public void setClazz(Class<T> clazz) {  
	        this.clazz = clazz;  
	    }
	    
	    /** 
	     * 普通的非泛型类Class 
	     * 泛型化的类Class<T> 
	     * JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型; 
	     * 但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型; 
	     * @param args 
	     */  
	    public static void main(String[] args) {  
	        SuperClass<Person> subClass = new SubClass();  
	        //1.得到泛型类T实际的完整类名  
	        System.out.println(subClass.getClazz());  
	        //2.得到泛型类T的对象  
	        try {  
	            System.out.println(subClass.getClazz().newInstance());  
	        } catch (InstantiationException e) {  
	            e.printStackTrace();  
	        } catch (IllegalAccessException e) {  
	            e.printStackTrace();  
	        }  
	        //3.调用泛型类T的方法  
	        try {  
	        	subClass.getClazz().newInstance().function();  
	        } catch (InstantiationException e) {  
	            e.printStackTrace();  
	        } catch (IllegalAccessException e) {  
	            e.printStackTrace();  
	        }  
	    }  
}


输出结果如下:
class myGenetic.Person
myGenetic.Person@10d448
function in Person.class...


分享到:
评论
1 楼 kkmike999 2014-01-30  
太好的例子了~~~~

相关推荐

    Java泛型类型擦除后的补偿

    在Java编程语言中,泛型是一种强大的特性,它允许我们在定义类、接口和方法时引入类型参数,从而实现参数化类型。然而,Java的泛型并非像C++或C#那样在运行时存在,而是在编译期间经历一个称为“类型擦除”的过程。...

    java5泛型新特性 pdf

    8. **类型推断**:Java 5及后续版本提供了类型推断,编译器可以根据上下文自动推断类型参数,简化代码。例如,`List&lt;String&gt; list = new ArrayList();` 9. **泛型和枚举**:泛型也可应用于枚举类型,为每个枚举常量...

    Java泛型_Java中的泛型结构_

    Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...

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

    Java 泛型编程是一种强大的工具,它允许我们在编写代码时引入类型参数,从而提高了代码的灵活性和安全性。泛型在Java中主要应用于类、接口和方法,使得程序员可以在编译时检查类型安全,并且可以消除运行时的类型...

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

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

    java 泛型入门 实例

    - 也可以使用类型参数`&lt;?&gt;`来表示父类的泛型类型不确定,这样在子类中可以操作父类的方法,但不能访问具体的泛型类型信息。 7. **野指针警告** - 在未使用泛型的旧代码中,可能会出现“可能的不匹配类型”警告。...

    Java1.5泛型指南中文版

    在 Java 中,可以通过在类、接口或方法的声明中添加尖括号 `&lt; &gt;` 来引入类型参数。例如,在 `List&lt;E&gt;` 中,`E` 就是一个类型参数,代表 “Element”。这使得 `List` 接口能够接受任何类型的元素,同时在编译时保留...

    Java泛型总结(2)进阶篇

    自Java 7起,编译器支持类型推断,允许在某些情况下省略类型参数。例如,当我们调用泛型方法时,编译器可以通过上下文自动推断出类型。 10. 泛型与反射 虽然泛型在运行时被擦除,但反射仍然可以在某种程度上检测...

    Java1.5泛型指南中文版.doc

    Java中的泛型主要通过类型参数来实现。类型参数(或称为类型变量)是一个标识符,用于表示一个未知的具体类型。在定义泛型类或方法时,这些类型参数被放在类名或方法签名之后的一对尖括号`&lt;&gt;`内。 例如,在`java....

    泛型java的泛型知识,非常有用

    在Java中,泛型通常以尖括号 `&lt;T&gt;` 表示,其中 `T` 是类型参数,可以代表任何引用类型。 - 类如 `class Java_Generics,V&gt;`,`K` 和 `V` 就是类型参数,类似于函数中的变量,它们在实例化时会被具体的类型替换。 - ...

    关于java泛型的讲解

    Java 泛型是自Java SE 1.5版本引入的一种强大的编程工具,它允许在类、接口和方法中使用类型参数,从而实现了参数化类型。泛型的主要目标是提高代码的安全性和可重用性,同时减少类型转换的繁琐。 ### 1. 泛型的...

    java泛型学习

    在编译过程中,类型参数被替换为它们的边界类型(通常是Object),因此不同泛型参数的实例(如List和List)在运行时共享相同的类表示。这就是为什么`list1.getClass() == list2.getClass()`会返回true的原因。类型...

    java泛型例子

    1. 泛型类:泛型类是在类定义时引入类型参数的,比如`class Box&lt;T&gt;{ T item; }`,这里的`T`就是类型参数,代表任意类型。在创建对象时,我们可以指定具体的类型,如`Box&lt;String&gt; box = new Box();`,这样box就只能...

    JAVA泛型教程(帮你解决学习泛型的苦恼)

    Java泛型是Java语言的一个重要特性,它允许在类、接口和方法中声明类型参数,从而提高了代码的复用性和安全性。这个特性自Java 5引入以来,极大地改善了Java的类型系统,降低了类型转换异常的风险。 1. **使用泛型...

    java 泛型 demo

    Java 泛型是Java SE 5.0引入的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而实现对多种数据类型的统一处理。泛型的主要目的是提高代码的类型安全性和重用性,避免了运行时的类型转换,并且在编译...

    全面总结Java泛型

    Java 泛型是 Java 编程语言中一个强大的特性,它允许在类、接口和方法中使用类型参数,从而增加了代码的复用性和安全性。在本文中,我们将深入探讨 Java 泛型的各种方面。 首先,普通泛型允许我们在定义类时引入一...

    Java泛型通配符

    Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

Global site tag (gtag.js) - Google Analytics