java反射之通过反射了解集合泛型的本质(详解)

 更新时间:2017年06月05日 08:24:22   投稿:jingxian  
下面小编就为大家带来一篇java反射之通过反射了解集合泛型的本质(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文接上文“java反射之方法反射的基本操作方法”,利用反射了解下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反射之通过反射了解集合泛型的本质(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea如何忽略.iml文件和.idea目录

    idea如何忽略.iml文件和.idea目录

    这篇文章主要介绍了idea如何忽略.iml文件和.idea目录问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中2个对象字段值比较是否相同

    Java中2个对象字段值比较是否相同

    本文主要介绍了Java中2个对象字段值比较是否相同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 业务系统的Prometheus实践示例详解

    业务系统的Prometheus实践示例详解

    这篇文章主要为大家介绍了业务系统的Prometheus实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • spring data jpa查询一个实体类的部分属性方式

    spring data jpa查询一个实体类的部分属性方式

    这篇文章主要介绍了spring data jpa查询一个实体类的部分属性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • spring boot写java web和接口

    spring boot写java web和接口

    这篇文章主要介绍了spring boot写java web和接口,Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,下面详细内容需要的小伙伴可以参考一下
    2022-01-01
  • 配置Spring4.0注解Cache+Redis缓存的用法

    配置Spring4.0注解Cache+Redis缓存的用法

    本篇文章主要介绍了详解配置Spring4.0注解Cache+Redis缓存的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • spring cloud中微服务之间的调用以及eureka的自我保护机制详解

    spring cloud中微服务之间的调用以及eureka的自我保护机制详解

    这篇文章主要介绍了spring cloud中微服务之间的调用以及eureka的自我保护机制详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot依赖注入的三种方式

    SpringBoot依赖注入的三种方式

    本文将通过代码示例详细介绍SpringBoot依赖注入的三种方式,对学习依赖注入有一定的参考价值,需要的朋友可以参考一下
    2023-04-04
  • Java中的事件处理机制详解

    Java中的事件处理机制详解

    这篇文章主要介绍了Java中的事件处理机制详解,Java事件处理是采取"委派事件模型",当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类创建对象,需要的朋友可以参考下
    2023-09-09
  • java之向linux文件夹下写文件无权限的问题

    java之向linux文件夹下写文件无权限的问题

    这篇文章主要介绍了java之向linux文件夹下写文件无权限的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论