1。问题描述2.什么是异常3.异常系统分类4.反射概述5.反射机制的作用6.反射的三种实现方法7.通过反射获取类的方法8.通过反射创建对象9.invoke()Method类的方法10.思路分享11.代码实现作者简介1.问题描述《Integer类型的ArrayList如何同时添加String、Character、Boolean等类型的数据?》你想到下面的代码了吗?1;Characterch='c';Booleanbo=true;list.add(in);list.add(ch);list.add(bo);System.out.println(list);}}有一点Java基础的人知道上面的代码会运行如果使用Eclipse等开发工具,运行前会提示有错误,如下图:强制运行一波,看错误信息:Exceptioninthread"main"java.lang.Error:未解决的编译问题:Themethodadd(Integer)inthetypeListisnotapplicableforthearguments(Character)Themethodadd(Integer)inthetypeListisnotapplicablefortheearguments(Boolean)atcom.cya.test.Test.main(Test.java:15)listen英语不好的人都要做程序员!!不过没关系,能得到大概的意思就好了。上述错误的大致含义如下:程序在编译时遇到无法解析的错误。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(错误),它们都包含了大量的异常处理类。(1)错误(Error)程序中无法处理的错误,表示运行的应用程序发生了严重的错误。此类错误通常表示代码运行时JVM出现问题。通常有VirtualMachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。例如,当JVM用完可用内存时,将发生OutOfMemoryError。当发生这样的错误时,JVM将终止线程。这些错误是不可检查的非编码错误。因此,应用程序不应在此类错误发生时对其进行处理。(2)异常(Exception)程序本身可以捕获并处理的异常。Exception这种异常分为两类:运行时异常和编译异常。运行时异常(uncheckedexceptions):RuntimeException类及其子类表示JVM运行时可能发生的错误。例如,试图使用对空对象的引用(NullPointerException),以及数组下标越界(ArrayIndexOutBoundException)。这类异常是不可检查的异常,一般是由程序逻辑错误引起的。您可以选择是否在程序中捕获它。编译异常(checkedexception):Exception中除了RuntimeException及其子类之外的异常。如果程序中出现这样的异常,比如IOException,则必须对该异常进行处理,否则会编译失败。在程序中,通常不自定义此类异常,而是直接使用系统提供的异常类。看了Java的异常系统,我们知道上面代码中的异常是编译期异常,必须处理,否则无法通过编译阶段,更谈不上运行了。既然没有上面的代码,请拿出本期的主角---Java的反射机制。4.反射概述Java反射机制处于运行状态。对于任何一个类,你都可以知道这个类的所有属性和方法;对于任何对象,您都可以调用它的任何方法和属性;这种动态获取信息和动态调用对象方法的能力称为Java语言的反射机制。5、反射机制的作用是在运行时判断任何一个对象属于哪个类;在运行时构造任何类的对象;在运行时判断任何类的成员变量和方法;在运行时调用任何对象的方法;6.反射的三种实现都是通过对象的getClass()方法实现的。getClass()方法是Object类的一个方法,因为所有的类都继承自Object类,所以可以直接使用getClass()方法。通过.class属性传递类名。如果知道类名,就可以直接得到一个类的Class。通过Class类的forName(parameter)方法(常用)。这种方式是最常用的,在各种框架的配置文件中都可以看到,比如:Spring、SpringMVC、Mybatis等,其中parameter参数是一个全限定类名(即:包名+类名称),例如:com.cya.test.Test。7.通过反射获取类的方法方法名返回值参数说明getMethods()Method[]不能访问包括自身和继承的所有公共方法是的,与访问权限无关)getMethod(StringmethodName,Class>...parameterTypes)MethodmethodName:表示要获取的方法名parameterTypes:表示要获取的方法的参数的Class类型,比如String.class表示获取指定的公共方法(包括继承的)getDeclaredMethod(StringmethodName,Class>...parameterTypes)MethodmethodName:表示获取方法的名称parameterTypes:表示获取方法的参数的Class类型,如String.class表示获取指定此类中的一个方法(不包括继承)8.通过反射创建对象在Java中,除了使用new关键字创建对象外,还可以使用newInstance()方法来创建对象,例如:Classclass1=Class.forName("java.util.ArrayList");Listlist=(List)class1.newInstance();9.Method类的invoke()方法MethodpublicObjectinvoke(Objectobj,Objectargs[])function:动态调用Method类表示的方法obj:调用底层方法的对象必须是实例化对象args:方法调用使用的参数是一个object数组,因为可能有多个obj参数可以为空,但是必须填null,也就是说同类别的public方法的args参数可以为空,即对应的方法没有参数。我会专门开一期来讲解Java反射的细节。这里只是简单概括一下本期用到的几个重要知识点。方法,记得分享给大家。10、思路分享创建一个Integer类型的List集合来存储数据。使用objectname.getClass()方法获取Class对象。调用getMethod()方法获取指定的Method。调用invoke()方法将不同数据类型的数据添加到列表集合中。11、代码实现packagecom.cya.test;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[]args)throwsException{Listlist=newArrayList<>();Objecto;//向列表中添加Integer类型的数据Integerinteger=1;o=integer;Test.addObjectToList(list,o);//向列表中添加String类型的数据Stringstring="HelloWorld";o=string;Test.addObjectToList(list,o);//将Character类型数据添加到列表中Charactercharacter='c';o=character;Test.addObjectToList(list,o);//将Boolean类型数据添加到列表中Booleanboolean1=true;o=boolean1;Test.addObjectToList(list,o);System.out.println(list);}publicstaticListaddObjectToList(Listlist,Objecto)throwsException{Classclass1=list.getClass();Methodmethod=class1.getMethod("add",Object.class);method.invoke(list,o);returnlist;}}作者简介作者:又是C你,从事软件开发尝试搬砖的技术小白在里面。本文转载自微信公众号「C你又来了」,可关注下方二维码。转载本文请再次联系C你公众号。