原文链接:原文来自公众号:C you again,欢迎关注!

1、问题描述

    “如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据?”

    你是不是想到下面的代码?

package com.cya.test;

import java.util.ArrayList;
import java.util.List; public class Test{ public static void main(String []args){ List<Integer> list=new ArrayList<>();
Integer in=1;
Character ch='c';
Boolean bo=true;
list.add(in);
list.add(ch);
list.add(bo);
System.out.println(list); } }

    有点Java基础的人都知道上面的代码运行会报错,如果使用Eclipse等开发工具的话在没运行之前就会提示有错了,如下图:



    强制运行一波,看下错误提示:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method add(Integer) in the type List<Integer> is not applicable for the arguments (Character)
The method add(Integer) in the type List<Integer> is not applicable for the arguments (Boolean) at com.cya.test.Test.main(Test.java:15)

    听说英语差的都去当程序员了!!

    不过没关系,能get到大体意思就好了,上面的错误大体意思如下:

程序在编译时遇到了无法解析的错误,

add方法的参数是Integer类型,无法接收Character类型的参数,

add方法的参数是Integer类型,无法接收Boolean类型的参数

    上面代码错误的原因是程序无法通过编译,在编译期出现异常,这和Java是编译性语言(如:C、C++、Delphi、Pascal、Java)有关。与解释性语言(如:Basic、javascript、Python)不同,Java先将后缀名为.java的源代码文件编译成后缀名为.class的字节码文件,编译期间会进行词法、语法、数据类型、语义分析。上面的错误就是在编译期间进行数据类型分析时类型不匹配造成的。

    谈到这里,我们不得不提下Java的异常体系,异常体系结构图如下:

2、什么是异常

    程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象。

3、异常体系分类

    如上面的Java异常体系结构图所示,Throwable有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类。

    (一)Error(错误)

    程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当JVM耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。

    这些错误是不可查的,非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

    (二)Exception(异常)

    程序本身可以捕获并且可以处理的异常。

    Exception这种异常又分为两类:运行时异常和编译异常。

  1. 运行时异常(不受检异常):RuntimeException类及其子类表示JVM在运行期间可能出现的错误。比如说试图使用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

  2. 编译异常(受检异常):Exception中除RuntimeException及其子类之外的异常。如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,否则编译不通过。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。

    看完了Java的异常体系,我们知道上面代码出现的异常为编译时异常,是必须要处理的,否则无法通过编译阶段,更不要谈运行了。

    既然上面代码不可用,那就请出本期的主角---Java的反射机制。

4、反射的概述

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

5、反射机制的作用

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

6、反射的三种实现方式

  1. 通过对象的getClass()方法。getClass()方法是Object类的方法,因为所有类都继承自Object类,所以可以直接使用getClass()方法。
  2. 通过类名.class属性。如果知道类的名称,可以直接获取一个类的Class。
  3. 通过Class类的forName(parameter)方法(常用)。这种方式是最常用的,在各类框架的配置文件中可以看到,如:Spring、SpringMVC、Mybatis等等。其中,参数parameter为全限定类名(即:包名+类名),如:com.cya.test.Test。

7、通过反射获取类中的方法

方法名称 返回值 参数 说明
getMethods() Method [] 获取包括自身和继承过来的所有的public方法
getDeclaredMethods() Method [] 获取自身类中所有的方法(不包括继承的,和访问权限无关)
getMethod(String methodName,Class<?>... parameterTypes) Method methodName:表示被获取方法的名字parameterTypes:表示被获取方法的参数的Class类型,如String.class 表示获取指定的一个公共的方法(包括继承的)
getDeclaredMethod(String methodName,Class<?>... parameterTypes) Method methodName:表示被获取方法的名字parameterTypes:表示被获取方法的参数的Class类型,如 String.class 表示获取指定的一个本类中的方法(不包括继承的)

8、通过反射创建对象

    java中,除了使用new关键字创建对象外,也可以用newInstance()方法创建对象,例如:

Class class1 = Class.forName("java.util.ArrayList");
List list=(List)class1.newInstance();

9、Method类的invoke()方法

public Object invoke(Object obj,Object args[])

作用:动态调用Method类代表的方法

obj:从中调用底层方法的对象,必须是实例化的对象

args:用于方法调用的参数,是个Object数组,因为参数有可能有多个

obj可以为空,但必填null,表示同类中的公用方法

args参数可以为空,就是对应方法没有参数

    有关Java反射的详细内容我将会专门出一期来讲解,这里只对本期用到的几个重要的知识点做概述。

    看完了上面的内容,你是不是对面试官的问题有解答思路了呢?下面给出小编自己的想法,如果你有更好的方法,记得跟大家分享哦。

10、思路分享

1、创建Integer类型的List集合,用于存放数据。

2、使用对象名.getClass()方法获取Class对象。

3、调用getMethod()方法获取指定的Method。

4、调用invoke()方法将不同数据类型的数据添加到list集合中。

11、代码实现

package com.cya.test;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; public class Test{ public static void main(String []args) throws Exception{ List<Integer> list=new ArrayList<>();
Object o; //向list中添加Integer类型的数据
Integer integer=1;
o=integer;
Test.addObjectToList(list, o); //向list中添加String类型的数据
String string="Hello World";
o=string;
Test.addObjectToList(list, o); //向list中添加Character类型的数据
Character character='c';
o=character;
Test.addObjectToList(list, o); //向list中添加Boolean类型的数据
Boolean boolean1=true;
o=boolean1;
Test.addObjectToList(list, o); System.out.println(list); } public static List<Integer> addObjectToList(List<Integer> list, Object o) throws Exception{ Class class1=list.getClass();
Method method=class1.getMethod("add", Object.class);
method.invoke(list, o);
return list;
} }

12、公众号推荐(资源加油站)

了解更多资源请关注个人公众号:C you again,你将收获以下资源

1、PPT模板免费下载,简历模板免费下载

2、基于web的机票预订系统基于web的图书管理系统

3、贪吃蛇小游戏源码

4、各类IT技术分享

13、文章推荐

推荐一:计算机网络中这些高频考题,你还在死记硬背吗?(一),讲述内容:IP地址及其分类,子网掩码的概念,网络号、主机号、直接广播地址计算方法等。

推荐二:计算机网络中这些高频考题,你还在死记硬背吗?(二),讲述内容:局域网接口配置、路由器的静态路由配置、OSPF动态路由协议配置和DHCP服务器配置。

推荐三:用x种方式求第n项斐波那契数,99%的人只会第一种,讲述内容:七种方式求解第N项斐波那契数。

    以上就是本期的所有内容了,是否对你有帮助呢?了解更多算法请关注公众号“C you again”。

演示地址:点击查看演示

面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用的更多相关文章

  1. ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

    java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象. ArrayList list ...

  2. java中使用反射往一个泛型是Integer类型的ArrayList中添加字符串,反射的案例1.

    //------------------------- //废话不多说,直接上代码.代码里面添加了详细的解释. import java.lang.reflect.Constructor; import ...

  3. long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?

    结论:数值范围大小和占用的字节没有关系. float类型的范围: 负数:-3.402823E38~-1.401298E-45 整数:0 正数:1.401298E-45~3.402823E38 long ...

  4. 如何在ArcGIS饼状图中下方添加文字

    内容源自:ArcGIS10.2基础教程(丁华) 书上要求在统计图的饼状图下方显示“总面积组成”,以及图例是只显示文字. 该如何操作呢? 其实就是在高级属性中选择标题-副标题-显示“总面积组成”即可 而 ...

  5. 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......

    背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...

  6. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  7. 面试官问线程安全的List,看完再也不怕了!

    最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...

  8. 面试官:Java中对象都存放在堆中吗?你知道逃逸分析?

    面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器.虚拟机栈.本地方法栈.堆.方法区 面试官:对象一般存放在哪个区域? 我:堆. 面试官:对象都存放在堆中吗? 我:是的. 面试官: ...

  9. 面试官最爱的volatile关键字

    在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性 ...

随机推荐

  1. webpack4.X + react搭建

    环境准备工作:windows7.webStorm 2017.1.4.Nodejs 8.7.0.npm 5.4.2 PS:安装的时我们都带上版本,这样即便webpack版本发生变化,也不会出现版本问题. ...

  2. pandas | 使用pandas进行数据处理——Series篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 上周我们关于Python中科学计算库Numpy的介绍就结束了,今天我们开始介绍一个新的常用的计算工具库,它就是大名鼎鼎的Pandas. Pa ...

  3. JavaScript图形实例:递归生成树

    观察自然界中树的分叉,一根主干生长出两个侧干,每个侧干又长出两个侧干,以此类推,便生长出疏密有致的结构.这样的生长结构,使用递归算法可以模拟出来. 例如,分叉的侧干按45°的偏转角度进行生长的递归示意 ...

  4. 前端动画必知必会:React 和 Vue 都在用的 FLIP 思想实战

    前言 在 Vue 的官网中的过渡动画章节中,可以看到一个很酷炫的动画效果 乍一看,让我们手写出这个逻辑应该是非常复杂的,先看看本文最后要实现的效果吧,和这个案例是非常类似的. 预览 分析需求 拿到了这 ...

  5. JIT的Profile神器JITWatch

    简介 老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏.有没有什么更加简便的方法来分析JIT日志呢?快来 ...

  6. VUE常用UI组件插件及框架

    UI组件及框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI - ...

  7. JSOI2015 Salesman(树型DP)

    [luogu6082] [题目描述] 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益 ...

  8. 通过源码学习@functools.lru_cache

    一.前言 通常在一些代码中包含了重复运算,而这些重复运算会大大增加代码运行所耗费的时间,比如使用递归实现斐波那契数列. 举个例子,当求 fibonacci(5) 时,需要求得 fibonacci(3) ...

  9. 控制流程之while循环, for循环

    条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行,循环终止死循环 基本使用 ...

  10. day76 vue框架入门

    目录 一.vue.js快速入门使用 1 vue.js库的下载 2 vue.js库的使用 3 vue.js的M-V-VM思想 4 显示数据 二.常用指令 1 操作属性 2 事件的绑定 3 样式操作 3. ...