java反射--通过反射了解集合泛型的本质
通过Class,Method来认识泛型的本质
package com.reflect; import java.lang.reflect.Method;
import java.util.ArrayList; public class MethodDemo2 { public static void main(String[] args) throws Exception
{
ArrayList list=new ArrayList();
ArrayList<String> list1=new ArrayList<String>(); list1.add("hello");
// list1.add(10);//会因为10不是String类型而出错
Class c1=list.getClass();
Class c2=list1.getClass();
System.out.println(c1==c2); //反射的操作都是编译之后的操作 /*
* C1==C2结果返回true,说明编译后集合的泛型是去泛型化的
* Java中,集合的泛型,是防止错误输入的,只在编译阶段有效
* 绕过编译就无效了
* 验证:我们可以通过方法的反射来操作,绕过编译
* */
Method m=c1.getMethod("add", Object.class);
m.invoke(list1, );
System.out.println(list1.size());
System.out.println(list1);
//此时不能用这种方式遍历了,因为之前已经插入了int类型的,这样会转化为String类型,会转换错误
for(String str:list1)
{
System.out.println(str);
}
}
}
运行结果:

分析上诉结果:
1,list和list1都能add加入集合String类型变量,但是list1由于使用了泛型,所以限定只能加入String类型的,而不能加入Int类型的,但是list没有使用泛型,所以
可以加入任意类型变量。使用泛型的作用就是为了防止输入了错误类型的变量。
2,list1不能加入int类型的变量,是因为编译时候,进行了校验,但是反射是在编译后进行的操作,因此可以绕过编译
3,因为c1==c2,说明list1和list是同一种类类型,都是ArrayList类的类类型。
4,因为泛型绕过了编译,所以使用泛型调用方法的时候,即使使用的是list1集合对象,依然可以插入int类型的变量。
5,list1对象插入了int类型的变量后,不能使用foreach方式输出了,因为此时是通过编译的方式,需要进行int到String类型的转型,显然会报错。
java反射--通过反射了解集合泛型的本质的更多相关文章
- Java反射的理解(六)-- 通过反射了解集合泛型的本质
Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质 ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- java通过反射了解集合泛型的本质
- Java框架基础——反射(reflect)
一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...
- JAVA 中的 反射
CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...
- 用反射来了解Java中泛型的本质
这篇文章主要通过Class的Method来了解泛型的本质. 先new 两个List,一个不加类型限制,另外一个限制类型为String: ArrayList list = new ArrayList() ...
- reflect 反射结合集合泛型的总结
集合泛型: 可以放任何对象的 ArrayList ArrayList list = new ArrayList(); 没有限定泛型类型. list.add("lilin");l ...
- Java反射、反射练习整理
反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- Java 异常与反射 总结
1.异常 异常,简单来说,就是一个程序执行过程中发生的不正常情况的事件.它发生在程序的运行期间,干扰了正常的指令流程.如果没有处理异常,那么出现异常之后,程序会停止运行.异常分为运行异常和非运行异常. ...
随机推荐
- Problem A: 深入浅出学算法002-n个1
Description 由n个1组成的整数能被K(K<10000)整除,n至少为多少? Input 多组测试数据,第一行输入整数T,表示组数 然后是T行,每行输入1个整数代表K Output 对 ...
- bzoj 3289 莫队 逆序对
莫队维护逆序对,区间左右增减要分类讨论. 记得离散化. /************************************************************** Problem: ...
- html5开发<video>视频字幕的程序
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8 ...
- TMapTextfile v.99/1
By Hellinger Software. Class to handle text files as memory mapped files. Including efficient method ...
- 对printf函数的理解1
看如下代码: #include <stdio.h> int main(int argc, const char *argv[]) { printf("%s\n",&qu ...
- java Integer包装类装箱的一个细节
原文:https://www.cnblogs.com/JackPn/p/9392145.html java有八个基本数据类型,每个都有对应的一个包装类,比如int对应的Integer.从jdk1.5开 ...
- windows10使用arcgis注意事项
平板电脑模式
- 每天进步一点点——关于SSD写入放大问题
转载请说明出处:http://blog.csdn.net/cywosp/article/details/29812433 1. 关于SSD的写入放大 之前在SSD(Solid State Dr ...
- AIR:使用 HTML + Javascript 开发桌面应用
背景 断断续续用Winform和WPF开发过一些小工具,始终不得其法门,在玩Flex的时候就接触过AIR,最近发现可以用HTML + Javascript开发AIR应用,本文就尝试一下(Hello,W ...
- [Todo] Nodejs学习及Spider实验(包括php入门学习、React入门学习)
/Users/baidu/Documents/Data/Interview/Web-Server开发 深入浅出Node.js-f46c http://blog.csdn.net/u012273376/ ...