【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理
文章目录
一、说一说你平时遇到的异常
1.常见异常
java.lang.NullPointerException
调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在使用数组的操作中。数组的初始化是对数组分配现需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)
排查步骤:
- 编译出错会打印堆栈信息,是应用程序在引发 Exception 时调用的方法列表,可以准确地定位到错误发生的根源
- 我们找到根源看看是不是忘记创建对象就使用变量了,大多数情况下系统会提示变量没有初始化
java.lang.ClassNotFoundException
当 JVM 尝试加载一个特定的类,而在 ClassPath 路径没有发现这个类的 Class 文件时会抛出该异常。使用 Class.forName() 加载类,该类的 Class 文件不在 ClassPath 路径
排查步骤:
- 绝大多数情况就是路径错了,检查路径就好了
java.lang.ArithmeticException
数学算术异常
排查步骤:
- 检查目标位置涉及算术运算的地方是否有不妥
java.lang.ArrayIndexOutOfBoundsException
数组下标越界
排查步骤:
- 检查目标位置数组的下标是否越界
java.lang.IllegalArgumentException
方法参数错误,通常是缺少参数,或者参数类型、顺序不匹配
排查步骤:
- 检查调用方法的参数列表
java.lang.IllegalAccessException
非法访问,通常是没有权限访问,比如说使用反射机制访问类的私有成员时
排查步骤:
- 可以使用 setAccessible(true) 暴力破解
java.lang.StackOverflowError
堆栈溢出,当一个递归调用的层次太深或者死循环会导致该异常
排查步骤:
- 检查循环条件
- 检查递归是否没有设置出口,或者需要对算法进行优化
java.lang.ClassCastException
类型转换异常,是 JVM 在检测到两个类型间转换不兼容时引发的运行时异常
排查步骤:
- 检查是否声明了错误的类型
二、什么情景下会用到反射
1.分析
Java 反射主要提供以下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
不使用反射的理由:
- 反射影响性能,反射相当于一系列解释操作,通知 JVM 要做哪些事,Java 反射机制中包含了一些动态类型,所以 Java 虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题
- 使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射
- 反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了 Java 程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异
不得不使用反射的场景:
- 不能明确接口调用哪个函数,需要根据传入的参数在运行时决定
- 不能预知传入参数的参数类型,需要在运行时处理任意的对象
常见场景:
- 使用 JDBC 连接数据库时使用 Class.forName() 通过反射加载数据库的驱动程序
- Spring 通过 XML 配置模式装载 Bean 的过程:首先将程序内所有 XML 或 Properties 配置文件加载入内存。然后解析 XML 或 Properties 里面的内容,得到对应实体类的字节码字符串以及相关的属性信息。最后使用反射机制,根据这个字符串获得某个类的 Class 实例,动态配置实例的属性
- JDK 代理需要使用反射技术在运行时创建代理对象
三、反射的底层原理
1.原理
所有语言的反射,不论是 IL 类语言(中间语言,Intermediate Language,Java就是一种),还是 C++/Delphi 等原生语言,都是一个编译期和运行期技术结合的产物
在编译期间,编译器是需要确定地知道所有信息的,比如类实例化后的大小,类的字段(Fields),类的方法(地址)以及方法类型。这些信息都是以表或者结构的形式存储在目标文件中,Java 就是 .class 信息
在运行期间,Java 的底层实现代码(C++)可以准确地读取这些信息,这样就可以得到类有哪些 Field、Method、Interface 以及方法连接的入口等信息。为了方便编程人员使用,就把这些操作抽象成类或者接口,比如说 Class 对象和 reflect 接口
参考链接
java开发中 10 大经常遇到的异常
记住这五种常见的异常,防止面试被问
面试官:说一下Java反射机制的应用场景
在什么样的场景下,需要利用到Java的反射特性编程?
什么情况下需要使用反射
什么是反射?反射机制的应用场景有哪些?