java5核心基础泛型(2):泛型在反射中的应用

如何通过反射获取指定参数类型的构造函数?

贴代码如下:

package highBasic.generic;
/**
 * 泛型入门
 */
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;

public class GenericTest {
	public static void main(String[] args) throws Exception
	{
		ArrayList collection =new ArrayList();
		//在list中添加元素
		collection.add(1);
		collection.add(1L);
		collection.add("abc");
		int i=(Integer)collection.get(0);
		//int i1=(Integer)collection.get(1);//----出现异常的语句
		ArrayList<String> collection2 =new ArrayList<String>();
		//在list中添加元素
		//collection2.add(1);//
		//collection2.add(1L);//----编译器报错了,原由是这时候规定了只能存储string对象
		collection2.add("abc");
		String element=collection2.get(0);
		System.out.println(element);
		//-----泛型在==反射==中的应用:通过反射获取指定类型的构造函数---------------1		           		                        Constructor<String> constructor=String.class.getConstructor(StringBuffer.class);
		//通过泛型限定以后,就能够知道这个对象肯定是String类型的构造方法,如果不用泛型出现的结果
		//和上面定义集合对象的时候是类似的。
		String string2=constructor.newInstance(new StringBuffer("abc"));
		System.out.println(string2.charAt(0));
		/*
		 * 总结:那么到底在哪些地方可以用泛型?
		 * 我们可以查阅技术文档,看类型的定义,如果是类似于 Object<T>这种形式就是可以用泛型的。
		 */
		//----泛型是在编译器阶段起作用的,解决了运行时候可能出现的异常。
		ArrayList<Integer> collection3=new ArrayList<Integer>();
		//如果想等说明collection2和collection3指向的是同一份字节码。
		System.out.println(collection2.getClass()==collection.getClass());
		//打印的结果是true
		//-------是否可以透过编译器给collection3中添加String对象呢?------------------------------------
		//collection3.add("abc");------报错
		Method method=collection3.getClass().getMethod("add",Object.class );
		method.invoke(collection3, "abc");
		System.out.println("透过编译器,将String对象传到Integer类型的集合对象中,输出结果:"+collection3.get(0));
		//输出:“透过编译器,将String对象传到Integer类型的集合对象中,输出结果:abc”
		//说明以上做法实现了。
		//那么问题是这样的做法有什么用途----------------------------?}}

上述1注释以下的code:利用反射机制获取了参数为StringBuffer类型的String类的构造函数 constructor,然后通过constructor的newInstance()方法传入StringBuffer类型的参数创建了String对象。最后将String对象 string2的引用指向它。

以上代码就成功的通过反射方式获取了指定参数类型的String类的构造函数。

java5核心基础泛型(2):泛型在反射中的应用,码迷,mamicode.com

时间: 2024-10-06 03:41:15

java5核心基础泛型(2):泛型在反射中的应用的相关文章

java5核心基础之泛型(1)

什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型.泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念.(引自百科) 理解了以下代码,就会明白为何要用泛型! 下面还是直接贴出代码,看看这个java5的新特性,泛型的使用吧: package highBasic.generic; /** * 泛

java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGeneri

java5核心基础之泛型(3)-泛型作用于编译阶段-如何将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候只能传入指定类型数据到泛型集合对象中去.如何验证呢,贴代码如下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGenericInt

编程基础系列--之--泛型基础,检索枚举,以及在抽象工厂中的使用

万丈高楼平地起,基础是重中之重,虽说基础在生产环境下作用并不大,但是扎实的基础是你不断学习的保障.今天继续探讨基础--泛型. 刚刚步入社会,开始自己的第一份工作,在工作中遇到这样一个业务场景:我需要将枚举字段存到数据库中,数据库是一位大佬设计的,枚举字段是英文,对应的值是int类型,我要在界面上显示的值却要是中文,这个问题其实并不难,按照我一开始的思路,我只需要根据数据库中存的值查询出来,必要的时候手动将英文转换成中文就可以了.但是在实际做项目的过程中才发现.这样设计的程序太死板而且特别麻烦.有

.net学习之泛型、程序集和反射

一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> 2.执行的时候,当JIT编译器第一次遇到MyList<int>时,将用int替换“范型版”IL代码与元数据中的T—进行泛型类型的实例化.例如 :Main函数中显示的<int> 3.什么是泛型泛型是具有占位符(类型参数)的类.方法.结构.接口 4.泛型类的继承public class F

泛型约束和利用反射修改对象属性的值

周日了都,昨天休息了一天,今天想想得敲敲代码练习一下,如下关于泛型约束和利用反射修改对象属性的值的, 都挺简单的,呵呵,但时间一长,不经常使用还容易忘记在此就当记录一下了, 首先泛型代码一般是如下的情形: 加了泛型约束,只允许引用类型并且是只能是无参数的构造函数的类型才能传入,也就是不允许给类构造参数传递实参,否则将报错. 错误 1 “XXXXXX.pros”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“ 1 public static T GetObject<T>(T

C#基础加强_泛型的基本原理

小弟初写博文,深感“易敲千行码,难下百余文”的道理. 内容粗略浅薄,望各位大神海涵! 动态数组ArrayList可以实现不断的增长,让我们感受到了在某些地方较数组有优越感.但它包含的数组类型是object类,意味着需要转为数组时,存在拆装箱操作,这带来不必要的麻烦,也损失了性能.而List<T>泛型集合的出现便大大解决了上述问题. //泛型 --泛指某一个类型.这种类型需要用户自己确定 List<string> lists = new List<string>(); /

黑马程序员——集合基础知识(泛型)

集合:泛型基础知识 泛型.(泛型就是类型参数化,默认的时object,虽然不用强制类型转换,这个就要你自己去写特性方法,比如compareto是string的特有方法吧,你可以写但是父类肯定调用不了) itnex t对象都是obj要使用对象的特性功能必须强.编译的时候没问题,因为都不知道你会传什么对象,你橙子也可以当作apple来传,设计的时候并不知道! 泛型作用.1.用于解决安全问题.运行时期出现的问题classcastexception转移到编译时期.2.迭代器里面的itnext()不用强转

C#基础知识之泛型

泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用. 其实官方文档说明的很详细,我这边算是做个记录吧 一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能. 泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法.您可以通过数据类型的替代参数编写类或方法的规范.当编译器遇到类的构造函数或方法的函数调用时,它会生