`
lxtc2014
  • 浏览: 10699 次
  • 性别: 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上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    Java开发技术大全(500个源代码).

    readDataThread.java 读取数据的线程类 demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java ...

    廖雪峰 Java 教程.doc

    读取classpath资源 序列化 Reader Writer PrintStream和PrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 ...

    JAVA上百实例源码以及开源项目源代码

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

    Java2核心技术.part5

    1.5关于Java的常见误解 第2章Java程序设计环境 2.1安装Java开发工具箱 2.1.1下载JDK 2.1.2设置执行路径 2.1.3安装库源代码和文档 2.1.4安装本书中的示例 2.1.5导航Java目录 2.2选择开发环境 ...

    java jdk实列宝典 光盘源代码

    java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的...

    java开源包4

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包101

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包11

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包6

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包9

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包8

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包10

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包5

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java开源包1

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包3

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

Global site tag (gtag.js) - Google Analytics