本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质

1、初始化两个集合,一个使用泛型,一个不使用

 ArrayList list1 = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();

2、有定义类型可得在list2中添加int类型会报错

 list2.add("Hello");
list2.add(20); //报错

3、获取两个对象的类类型进行比较

 Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.println(c1 == c2);

通过c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的,java中集合的泛型是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了

4、验证:通过方法的反射来绕过编译

 try {
Method m = c2.getMethod("add", Object.class);
m.invoke(list2,20);
System.out.println(list2);
} catch (Exception e) {
e.printStackTrace();
}

5、输出结果

6、完整代码

 package com.format.test;

 import java.lang.reflect.Method;
import java.util.ArrayList; /**
* Created by Format on 2017/6/4.
*/
public class Test2 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();
list2.add("Hello");
// list2.add(20); //报错
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.println(c1 == c2);
/**
* 反射操作都是编译之后的操作
* c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的
* java中集合的泛型是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了
* 验证:通过方法的反射来绕过编译
*/
try {
Method m = c2.getMethod("add", Object.class);
m.invoke(list2,20);
System.out.println(list2);
} catch (Exception e) {
e.printStackTrace();
}
}
}

[Java反射基础四]通过反射了解集合泛型的本质的更多相关文章

  1. Java反射的理解(六)-- 通过反射了解集合泛型的本质

    Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质 ...

  2. java反射--通过反射了解集合泛型的本质

    通过Class,Method来认识泛型的本质 package com.reflect; import java.lang.reflect.Method; import java.util.ArrayL ...

  3. java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...

    类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...

  4. Java从零开始学四十(反射简述一)

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  5. Java从零开始学四十一(反射简述二)

    一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...

  6. [Java反射基础三]方法反射的基本操作

    本文接上文“获取类的信息”,利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ public void print(){ Syst ...

  7. java 编程基础 Class对象 反射 :参数反射

    方法参数反射 Java8在java.lang.reflect包下新增了Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method两个子类.Executabl ...

  8. java 面向对象(四十):反射(四)反射应用一:创建运行时类的对象

    1.代码举例Class<Person> clazz = Person.class; Person obj = clazz.newInstance();System.out.println( ...

  9. java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类

    java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...

随机推荐

  1. 如何从svn下载以前的项目版本

    showlog 你的项目,找到最老的log的版本号,然后svn co -r 最老的log的版本号 项目地址    

  2. 线上CPU100%?看看这篇是怎么排查的!

    前言 作为后端开发工程师,当收到线上服务器CPU负载过高告警时,你会这么做?重启服务,忽略告警?不过在我看来一个合格的工程师是一定要定位到具体问题所在的,从而 fix 它.下面记录一下线上服务器 CP ...

  3. IOS面试题(一)

    第一次写博客,我在这里先给大家分享一些iOS中常见的面试题吧! 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: ...

  4. 使用Git如何优雅的忽略掉一些不必的文件

    熟悉使用Git之后发现,使用sourceTree来管理和开发项目会变得更高效,现在我用bitbucket管理自己的项目,它提供了私有的仓库,用起来还是比较爽,不过刚开始用的时候,只要一打开本地仓库的工 ...

  5. tomcat 搭建以及发布配置

    身为开发人员, 一直干着开发的事情, 只干开发的事情, 却缺少了对于环境部署方面的必备技能的培养, 所以在公司安排的手头任务解决完的情况下, 自己抽空了解并且实践了一下tomcat的配置.写下通过网络 ...

  6. python全栈开发学习_day1_计算机五大组成部分及操作系统

    一.计算机五大组成部分: 1)五大组成: 1.控制器(指挥系统,用于控制其他计算机硬件的工作) 2.运算器(用于数学运算及逻辑运算) 3.存储器(寄存器,高速缓存,内存,磁盘(机械,固态),磁带) 4 ...

  7. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  8. [转] Ansible 系列之 Playbooks 剧本

    [From] https://www.cnblogs.com/hanyifeng/p/6435875.html 一.Playbooks 介绍 1.Playbooks是Ansible的配置,部署和编排语 ...

  9. 【Python】端口扫描脚本

    0x00   使用模块简介 1.optparse模块 选项分析器,可用来生成脚本使用说明文档,基本使用如下: import optparse #程序使用说明 usage="%prog -H ...

  10. CentOS&.NET Core初试-3-Nginx的安装和配置

    系列目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的安装和配置 安装守护服务(Supervisor) Nginx简介   Nginx是一个免费的,开源的,高 ...