reflect 反射结合集合泛型的总结
集合泛型:
可以放任何对象的 ArrayList ArrayList list = new ArrayList(); 没有限定泛型类型.
list.add("lilin");list.add(100);System.out.println(list);//很容得知结果能够是["lilin",100];
ArrayList<String> list1 = new ArrayList<String>(); 限定了只能存放String类型的数据
list1.add("lilin");
// String 泛型的集合 是不能添加int的类型的数据的
// list1.add(100);//此时编译是不会通过的,泛型检查了输入的正确性:
泛型的检查,只会在编译的时候检查,如果我们能够绕过编译的动作,就能避开输入的正确的检查操作,导致String泛型的集合中会存在不是String类型的数据.
反射reflect的操作,无论是CLass Method Filed 等,都是运行时加载的,不需要通过编译操作.
//下面通过反射操作,实现把int 100 放入 String泛型的list中去:
ArrayList<String> list = new ArrayList<String>();
Class c = list.getClass();
try {
//通过反射,获取到list的add方法,简单处理异常信息
Method m = c2.getMethod("add", Object.class);
//通过方法的反射,就能把int类型的数据,添加到string泛型的list中去
m.invoke(list1, 100);
//结果很明显,100 能够成功的添加进去
System.out.println(list1);
//此时要特别注意的:不能在用String 类型来for循环当前的list; 在循环到int的100会跑出类型不匹配的异常信息
for (String s : list1) {
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}
其实:本质的原因是,泛型主要是控制输入的正确验证的,而编译后的泛型集合类型,也就是 Class c1 = list.getClass(); Class c2 = list1.getClass();
在编译后,集合的泛型是去泛型的,通过验证System.out.println(c1 == c2); 结果是true,也就是集合编译后,都是同一个类类型.
所以:集合的泛型和反射的相关的方法结合使用时,要特别注意,反射的是运行时加载的,集合的编译检查输入的正确是会被绕过的.
reflect 反射结合集合泛型的总结的更多相关文章
- Java反射的理解(六)-- 通过反射了解集合泛型的本质
Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质 ...
- java反射--通过反射了解集合泛型的本质
通过Class,Method来认识泛型的本质 package com.reflect; import java.lang.reflect.Method; import java.util.ArrayL ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- [javaEE] 反射-通过反射了解集合泛型本质
java中的泛型是防止错误输入的,只在编译时刻起作用 package com.tsh.reflect; import java.lang.reflect.Method; import java.uti ...
- java通过反射了解集合泛型的本质
- Java reflect 反射学习笔记
1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...
- java reflect反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆对象,( ...
- Java —— Reflect反射机制
JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
随机推荐
- js 按钮连击 减少触发事件次数
<body> <input type="button" onClick="testbtn()" value="测试按钮"& ...
- python 整型,布尔值,字符串相关
1.整型(int) 就是所有整数, 2.布尔值(bool) True False 0,"",[],{},(),none为False 3.字符串(str) 字符: 是单一文字符号 字 ...
- Visual Studio 2015中 安卓环境 cannot find adb.exe in specified sdk path
安装完成后 发现 C:\Program Files (x86)\Android\android-sdk\platforms 是空的,用SDK Manager进行安装时发现 它需要往C:\Program ...
- 关于MySQL日期操作函数 date_formate 的使用
基本语法:DATE_FORMAT(date,format)说明:date 参数是合法的日期.format 规定日期/时间的输出格式.可以用的格式主要有格式 描述%a 缩写星期名%b 缩写月名%c 月, ...
- BZOJ 1042: [HAOI2008]硬币购物 容斥原理_背包_好题
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值的东西.请问每次有多少种付款方法. 题解: 十分喜 ...
- vim牛逼的code工具: ctags+ cscope
自己总结 在我的工作目录里的.vimrc中做了这样的配置: set tags=tags; set autochdir 在项目根目录里利用"sudo ctags -R *", ...
- DNS解析流程原理(图例)
13台根服务器的dns: 1.root-servers.net198.41.0.4美国2.root-servers.net192.228.79.201美国(另支持IPv6)3.root-servers ...
- Python3爬虫环境配置
一.包管理工具Anaconda安装 1.安装直接在官网下载最新版本的 https://www.continuum.io/downloads 2.配置环境变量PATH:C:\Users\Administ ...
- html5 过程解决问题收集
1.使用画布时报错误: Uncaught TypeError: Object [object Object] has no method 'getContext' . 解决方法: $(function ...
- 01springMVC入门
1 MVC模式回顾 Spring MVC是一种基于MVC的Web应用框架. MVC是一种设计模式,MVC在b/s系统下的应用: 执行步骤: 发出请求,请求到MVC当中的C,C接收请求后并不能 ...