- 浏览: 270380 次
- 性别:
- 来自: 新乡
文章分类
- 全部博客 (227)
- servciemix (10)
- db (18)
- javaTools (4)
- hibernate (31)
- web (3)
- spring (14)
- design pattern (4)
- java security (3)
- portal (1)
- ejb (6)
- session (2)
- java_lang (21)
- jbpm (29)
- struts (7)
- orgRights (2)
- project manager Jira (7)
- 跨库事务 (2)
- mysql (14)
- ubuntu (7)
- osgi (9)
- maven ant make (4)
- 分布式 高并发 高性能 (5)
- virgo-dm_server (0)
- osgi web (3)
- platform (1)
- smooks (1)
- business (1)
- 职场生涯 (14)
- Java编码格式 (2)
- web服务 (1)
- 计算机使用 (1)
- 健康工作生活的保障,工作中务必抛掉的不良心态 (4)
- 电信-网络监控 (1)
- 多线程-multithread (1)
- 海量数据-高性能 (2)
- Mybatis (1)
- web开发平台研发 (0)
- oracle (0)
- 应用服务器调优 (0)
- web前端 (0)
- servlet-jsp (0)
- tomcat (2)
- newtouch (1)
- portal_liferay (2)
- version control (1)
- apm-impact (2)
- tools (1)
- 研发管理 (1)
- 电商业务 (1)
- 生鲜电商市场调查 (0)
- PBX (0)
- 房东 (0)
最新评论
-
lifuchao:
...
权限问题 -
Branding:
谢谢,受教了,另外,CONN AS SYSDBA,必须是在操作 ...
Oracle密码忘记了怎么办? -
zhuchao_ko:
...
Portal实现原理 -
败类斯文:
不知道改哪里。。。木有见到红色。。表示悟性低了、、
jira error: Neither the JAVA_HOME nor the JRE_HOME environment variable is defin -
c__06:
正文:假如事务我是这样定义的: <tx:method n ...
Spring中Transactional配置
对泛型进行反射
今天在用反射的时候突然想到,之前从来没有对泛型对象进行反射,故决定尝试一下
首先要获取某个泛型类的Type,键入如下代码:
1. Type t = Type.GetType("System.Collections.Generic.List<int>");
2.
但是调试发现,t为null,看来类名写的不对,再试试,System.Collections.Generic.List,还是错,再试试System.Collections.Generic.List<T>,还是不对,接连又试了好几个,还是不对,毛了,先看看List<int>的Type究竟是啥,键入如下代码查看:
1. List<int> list = new List<int>();
2. Type t = list.GetType();
3. Console.WriteLine(t.FullName);
4.
结果输出:System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
我就晕,咋是这么个玩意儿?那就再试试
1. Type t = Type.GetType("System.Collections.Generic.List`1[System.Int32]");
再次调试,好,这回对了
接着我们来调用一下List<int>的Add方法,往里插入一条数据试试
1. MethodInfo add = t.GetMethod("Add", new Type[1] { typeof(int) });//找到Add方法
2. object list = t.InvokeMember(null,
3. BindingFlags.DeclaredOnly |
4. BindingFlags.Public | BindingFlags.NonPublic |
5. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });//实例化一个List<int>对象list
6. add.Invoke(list, new object[] { 12356 });//调用Add方法,往list中插入一条数据
7. Type t2 = list.GetType();
8. Console.WriteLine(t2.InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));//获取list的第一条索引输出
输出结果正确,接下来我又想用反射调用一下泛型的方法,再写入以下代码:
1. MethodInfo convert = t2.GetMethod("ConvertAll", BindingFlags.Public | BindingFlags.Instance);//获取ConvertAll泛型方法
2. object list2 = Type.GetType("System.Collections.Generic.List`1[System.String]").InvokeMember(null, BindingFlags.DeclaredOnly |
3. BindingFlags.Public | BindingFlags.NonPublic |
4. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });//实例化一个List<string>对象list2用以存储类型转换后的数据
5. list2 = convert.Invoke(list, new object[] { new Converter<int, string>(Convert.ToString) });//调用ConvertAll方法
6. Console.WriteLine(list2.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));//输出list2的第一个索引值
7.
再次调试,但是很可惜,出现了以下错误:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作。
这是怎么回事?查阅了以下MSDN,其中给出的MethodInfo.ContainsGenericParameters 属性的解释为:
为调用泛型方法,方法自身的类型参数或任何封闭类型中必须不含泛型类型定义或开放构造类型。进行这种递归确认是很困难的。为方便起见,也为了减少错误,ContainsGenericParameters 属性提供一种标准方法来区分封闭构造方法(可以调用)和开放构造方法(不能调用)。如果 ContainsGenericParameters 属性返回 true,则方法不能调用。
那这样看来是因为我没有将泛型的类型先传进去造成的,再次查阅了一下msdn,发现了MakeGenericMethod方法,该方法
将当前泛型方法定义的类型参数替换为类型数组的元素,并返回表示结果构造方法的 MethodInfo 对象。行,有戏,再次试试,在Invoke前加上如下代码:
1. convert = convert.MakeGenericMethod(typeof(string));
再次调试,OK,正常了,至此,我们用对泛型进行反射调用成功了,完整代码:
1. Type t = Type.GetType("System.Collections.Generic.List`1[System.Int32]");
2. MethodInfo add = t.GetMethod("Add", new Type[1] { typeof(int) });
3. object list = t.InvokeMember(null,
4. BindingFlags.DeclaredOnly |
5. BindingFlags.Public | BindingFlags.NonPublic |
6. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
7. add.Invoke(list, new object[] { 12356 });
8. Type t2 = list.GetType();
9. Console.WriteLine(t2.InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));
10. MethodInfo convert = t2.GetMethod("ConvertAll", BindingFlags.Public | BindingFlags.Instance);
11. object list2 = Type.GetType("System.Collections.Generic.List`1[System.String]").InvokeMember(null, BindingFlags.DeclaredOnly |
12. BindingFlags.Public | BindingFlags.NonPublic |
13. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
14. convert = convert.MakeGenericMethod(typeof(string));
15. list2 = convert.Invoke(list, new object[] { new Converter<int, string>(Convert.ToString) });
16. Console.WriteLine(list2.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, list2, new object[] { 0 }));
今天在用反射的时候突然想到,之前从来没有对泛型对象进行反射,故决定尝试一下
首先要获取某个泛型类的Type,键入如下代码:
1. Type t = Type.GetType("System.Collections.Generic.List<int>");
2.
但是调试发现,t为null,看来类名写的不对,再试试,System.Collections.Generic.List,还是错,再试试System.Collections.Generic.List<T>,还是不对,接连又试了好几个,还是不对,毛了,先看看List<int>的Type究竟是啥,键入如下代码查看:
1. List<int> list = new List<int>();
2. Type t = list.GetType();
3. Console.WriteLine(t.FullName);
4.
结果输出:System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
我就晕,咋是这么个玩意儿?那就再试试
1. Type t = Type.GetType("System.Collections.Generic.List`1[System.Int32]");
再次调试,好,这回对了
接着我们来调用一下List<int>的Add方法,往里插入一条数据试试
1. MethodInfo add = t.GetMethod("Add", new Type[1] { typeof(int) });//找到Add方法
2. object list = t.InvokeMember(null,
3. BindingFlags.DeclaredOnly |
4. BindingFlags.Public | BindingFlags.NonPublic |
5. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });//实例化一个List<int>对象list
6. add.Invoke(list, new object[] { 12356 });//调用Add方法,往list中插入一条数据
7. Type t2 = list.GetType();
8. Console.WriteLine(t2.InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));//获取list的第一条索引输出
输出结果正确,接下来我又想用反射调用一下泛型的方法,再写入以下代码:
1. MethodInfo convert = t2.GetMethod("ConvertAll", BindingFlags.Public | BindingFlags.Instance);//获取ConvertAll泛型方法
2. object list2 = Type.GetType("System.Collections.Generic.List`1[System.String]").InvokeMember(null, BindingFlags.DeclaredOnly |
3. BindingFlags.Public | BindingFlags.NonPublic |
4. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });//实例化一个List<string>对象list2用以存储类型转换后的数据
5. list2 = convert.Invoke(list, new object[] { new Converter<int, string>(Convert.ToString) });//调用ConvertAll方法
6. Console.WriteLine(list2.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));//输出list2的第一个索引值
7.
再次调试,但是很可惜,出现了以下错误:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作。
这是怎么回事?查阅了以下MSDN,其中给出的MethodInfo.ContainsGenericParameters 属性的解释为:
为调用泛型方法,方法自身的类型参数或任何封闭类型中必须不含泛型类型定义或开放构造类型。进行这种递归确认是很困难的。为方便起见,也为了减少错误,ContainsGenericParameters 属性提供一种标准方法来区分封闭构造方法(可以调用)和开放构造方法(不能调用)。如果 ContainsGenericParameters 属性返回 true,则方法不能调用。
那这样看来是因为我没有将泛型的类型先传进去造成的,再次查阅了一下msdn,发现了MakeGenericMethod方法,该方法
将当前泛型方法定义的类型参数替换为类型数组的元素,并返回表示结果构造方法的 MethodInfo 对象。行,有戏,再次试试,在Invoke前加上如下代码:
1. convert = convert.MakeGenericMethod(typeof(string));
再次调试,OK,正常了,至此,我们用对泛型进行反射调用成功了,完整代码:
1. Type t = Type.GetType("System.Collections.Generic.List`1[System.Int32]");
2. MethodInfo add = t.GetMethod("Add", new Type[1] { typeof(int) });
3. object list = t.InvokeMember(null,
4. BindingFlags.DeclaredOnly |
5. BindingFlags.Public | BindingFlags.NonPublic |
6. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
7. add.Invoke(list, new object[] { 12356 });
8. Type t2 = list.GetType();
9. Console.WriteLine(t2.InvokeMember("Item", BindingFlags.GetProperty, null, list, new object[] { 0 }));
10. MethodInfo convert = t2.GetMethod("ConvertAll", BindingFlags.Public | BindingFlags.Instance);
11. object list2 = Type.GetType("System.Collections.Generic.List`1[System.String]").InvokeMember(null, BindingFlags.DeclaredOnly |
12. BindingFlags.Public | BindingFlags.NonPublic |
13. BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
14. convert = convert.MakeGenericMethod(typeof(string));
15. list2 = convert.Invoke(list, new object[] { new Converter<int, string>(Convert.ToString) });
16. Console.WriteLine(list2.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, list2, new object[] { 0 }));
发表评论
-
Java程序员常用工具集
2012-05-23 14:30 987我发现很多人没办 ... -
基于JDBC的数据库连接池技术研究与设计
2011-12-16 14:34 775基于JDBC的数据库连接池技术研究与设计 摘 要 本文 ... -
关于jvm的设置
2011-12-16 10:38 1498一、Java heap space (一 ... -
JVM内存管理深入Java内存区域与OOM
2011-12-15 16:47 913JVM内存管理深入Java内存 ... -
JVM内存管理深入垃圾收集器与内存分配策略
2011-12-15 16:45 1139JVM内存管理深入垃圾收 ... -
jdbc 连接池小结
2011-12-15 16:43 896java基础面试题 主题:[我的工具箱] jXLS ... -
JVM参数调优
2011-12-15 14:35 821JVM参数调优是个很头痛 ... -
Java对象和JSON互转换利器-Gson
2011-11-04 17:22 1864Java对象和JSON互转换利器-Gson . 2008-07 ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-10-26 17:52 814java.lang.OutOfMemoryError: Per ... -
java.sql.Date,java.sql.Time和java.sql.Timestamp
2011-09-06 14:11 1128java.sql.Date,java.sql.Time和jav ... -
java 编码
2011-07-21 19:13 1266w.write(new String("中文网&qu ... -
Java反射经典实例 Java Reflection Cookbook
2011-05-05 19:05 772Java反射经典实例 Java Reflection Cook ... -
java 反射机制详解
2011-05-05 19:04 710java 反射机制详解 Java 的反射机制是使其具有动态特性 ... -
一次Java垃圾收集调优实战
2011-05-05 19:03 759一次Java垃圾收集调优实战 1 资料 * JDK5 ... -
利用反射和泛型让JDBC编程方便点
2011-05-05 19:02 833利用反射和泛型让JDBC编程方便点 一直以来使用JDBC编 ... -
利用反射取得泛型信息
2011-05-05 18:22 650利用反射取得泛型信息 一、传统通过反射取得函数的参数和返回值 ... -
深入剖析JAVA反射机制强大功能
2011-04-08 20:47 885* 深入剖 ... -
关于Java反射机制的一个实例
2011-04-08 20:46 839* 关于Java反射机制的一个实例 ... -
Java虚拟机内部构成浅析
2011-04-08 20:44 797* Java虚拟 ... -
详解reflect Java的反射机制
2011-04-08 20:42 534* 详解refle ...
相关推荐
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习
通过使用泛型,我们可以限制容器(如集合)中存储的元素类型,避免在运行时进行强制类型转换,并减少潜在的ClassCastException。例如,List表示一个只包含字符串的列表,这样就无法在其中添加整数或其他类型的对象。...
在Java编程语言中,泛型和反射是两个非常重要的特性,它们可以极大地提高代码的复用性和灵活性。本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。...
泛型主要是为了解决在编程中频繁进行类型转换的问题,而反射则允许程序在运行时动态地获取类的信息和调用方法。 泛型类型: 在 Java 5 之前,像 `Hashtable` 这样的集合类只能存储 `Object` 类型的数据,这意味着在...
泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的类型转换。这提高了代码的复用性和安全性。在C#中,我们可以定义泛型类、泛型接口、泛型方法等。例如,...
鉴于使用三层架构的过程中,数据库变动造成大量代码改动的问题,特意对三层架构进行了改进,数据库变动只需要简单修改model即可,同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
总结来说,泛型提供了一种编译时的类型安全机制,而反射则提供了运行时对类元数据的操作能力。两者结合使用,可以帮助开发者编写更加灵活、安全的代码,特别是在处理动态类型和框架设计时。理解并熟练掌握这两者,...
Java中的泛型和反射是两种强大的编程工具,它们各自提供了不同的能力,并且在某些情况下可以相互补充。泛型引入了类型安全,使得在编译时就能检测到类型错误,而反射则允许在运行时动态地获取和操作类、接口、字段和...
泛型+反射:泛型 笔记 ,课后作业
在Java编程语言中,泛型和反射是两个非常重要的特性,它们在开发高效、灵活的代码中发挥着关键作用。本篇文章将详细讲解如何利用泛型与反射来创建一个万能的数据库操作代码,如同标题所示,这可以极大提高代码的复用...
初步学习Java的泛型和反射机制,通过一些简单的例子来学习泛型,反射
4. **通用的验证**:基于泛型,我们可以创建一个验证框架,对所有继承自基类的实体进行通用或特定类型的验证。 5. **动态数据库操作**:如果实体对应数据库表,反射可以用于生成SQL语句,根据实体的属性动态构建...
在这个特定的案例中,"基于泛型反射的数据层封装"是利用了Java的泛型和反射特性来实现这一目标。泛型提供了一种在编译时类型安全的方式,允许我们创建可以处理多种类型的类、接口和方法。而反射则是Java提供的一种...
先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...
这可能涉及到对Java泛型和反射的深入理解,包括类型擦除、边界通配符、类型变量的实际类型等概念。如果遇到这样的问题,建议逐行分析代码,同时查阅相关文档和教程,加深对这两个概念的理解。 总之,泛型和反射都是...
本文将详细介绍如何结合这两种技术实现在Java中对MySQL、SQL Server或Oracle数据库进行动态的增删改查操作。 首先,Java反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和修改字段...