【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理

文章目录

  • 【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理
  • 一、说一说你平时遇到的异常
    • 1.常见异常
  • 二、什么情景下会用到反射
    • 1.分析
  • 三、反射的底层原理
    • 1.原理
  • 参考链接

一、说一说你平时遇到的异常

1.常见异常

java.lang.NullPointerException

调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在使用数组的操作中。数组的初始化是对数组分配现需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)

排查步骤:

  1. 编译出错会打印堆栈信息,是应用程序在引发 Exception 时调用的方法列表,可以准确地定位到错误发生的根源
  2. 我们找到根源看看是不是忘记创建对象就使用变量了,大多数情况下系统会提示变量没有初始化

java.lang.ClassNotFoundException

当 JVM 尝试加载一个特定的类,而在 ClassPath 路径没有发现这个类的 Class 文件时会抛出该异常。使用 Class.forName() 加载类,该类的 Class 文件不在 ClassPath 路径

排查步骤:

  1. 绝大多数情况就是路径错了,检查路径就好了

java.lang.ArithmeticException

数学算术异常

排查步骤:

  1. 检查目标位置涉及算术运算的地方是否有不妥

java.lang.ArrayIndexOutOfBoundsException

数组下标越界

排查步骤:

  1. 检查目标位置数组的下标是否越界

java.lang.IllegalArgumentException

方法参数错误,通常是缺少参数,或者参数类型、顺序不匹配

排查步骤:

  1. 检查调用方法的参数列表

java.lang.IllegalAccessException

非法访问,通常是没有权限访问,比如说使用反射机制访问类的私有成员时

排查步骤:

  1. 可以使用 setAccessible(true) 暴力破解

java.lang.StackOverflowError

堆栈溢出,当一个递归调用的层次太深或者死循环会导致该异常

排查步骤:

  1. 检查循环条件
  2. 检查递归是否没有设置出口,或者需要对算法进行优化

java.lang.ClassCastException

类型转换异常,是 JVM 在检测到两个类型间转换不兼容时引发的运行时异常

排查步骤:

  1. 检查是否声明了错误的类型

二、什么情景下会用到反射

1.分析

Java 反射主要提供以下功能:

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法
  4. 在运行时调用任意一个对象的方法

不使用反射的理由:

  1. 反射影响性能,反射相当于一系列解释操作,通知 JVM 要做哪些事,Java 反射机制中包含了一些动态类型,所以 Java 虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题
  2. 使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射
  3. 反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了 Java 程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异

不得不使用反射的场景:

  1. 不能明确接口调用哪个函数,需要根据传入的参数在运行时决定
  2. 不能预知传入参数的参数类型,需要在运行时处理任意的对象

常见场景:

  1. 使用 JDBC 连接数据库时使用 Class.forName() 通过反射加载数据库的驱动程序
  2. Spring 通过 XML 配置模式装载 Bean 的过程:首先将程序内所有 XML 或 Properties 配置文件加载入内存。然后解析 XML 或 Properties 里面的内容,得到对应实体类的字节码字符串以及相关的属性信息。最后使用反射机制,根据这个字符串获得某个类的 Class 实例,动态配置实例的属性
  3. JDK 代理需要使用反射技术在运行时创建代理对象

三、反射的底层原理

1.原理

所有语言的反射,不论是 IL 类语言(中间语言,Intermediate Language,Java就是一种),还是 C++/Delphi 等原生语言,都是一个编译期和运行期技术结合的产物

在编译期间,编译器是需要确定地知道所有信息的,比如类实例化后的大小,类的字段(Fields),类的方法(地址)以及方法类型。这些信息都是以表或者结构的形式存储在目标文件中,Java 就是 .class 信息

在运行期间,Java 的底层实现代码(C++)可以准确地读取这些信息,这样就可以得到类有哪些 Field、Method、Interface 以及方法连接的入口等信息。为了方便编程人员使用,就把这些操作抽象成类或者接口,比如说 Class 对象和 reflect 接口


参考链接

java开发中 10 大经常遇到的异常
记住这五种常见的异常,防止面试被问

面试官:说一下Java反射机制的应用场景
在什么样的场景下,需要利用到Java的反射特性编程?
什么情况下需要使用反射
什么是反射?反射机制的应用场景有哪些?

能不能讲讲JAVA反射的底层原理?

【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理相关推荐

  1. php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结

    重拾java基础(十三):String姐妹StringBuffer.StringBuilder总结 一.StringBuffer类概述buffer:缓冲 2. 字符串缓冲区,跟String非常相似,都 ...

  2. [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别

    [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别 Read 读入方法 read(): 一般是这种形式 public int read() 1.从流数据中读取的 ...

  3. 重拾java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  4. 重拾Java基础知识:运算符操作

    Java基础知识:运算符操作 前言 优先级 赋值 算术运算符 一元加减运算符 递增和递减 关系运算符 逻辑运算符 短路 位运算符 与(&) 或(|) 异或(^) 反(~) 左移(<< ...

  5. 重拾Java基础知识:设计模式

    设计模式 前言 模式分类 设计原则 单一职责原则 开闭原则 依赖倒置原则 接口分离原则 迪米特法则 里氏替换原则 合成复用原则 创建型模式 工厂模式(简单工厂.工厂方法.抽象工厂) 单例模式 原型模式 ...

  6. 重拾Java基础知识:IO流

    I0流 前言 字节流 InputStream OutputStream 字符流 Reader Writer 缓存流 转换流 序列化流 数据流 字节数组流 打印流 校验流 数据压缩 ZIP压缩和解压 G ...

  7. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  8. java基础05 GUI简单动画

    制作简单的动画,就是在绘图的基础上用上循环,实现图片的不断重绘,同时用白色消除上一次遍历绘画出来的痕迹 代码实现如下: package GuiTest;import javax.swing.*; im ...

  9. 重拾Java基础知识:网络编程

    网络编程 前言 网络体系结构 IP地址 IP地址分类 子网掩码 端口 域名 网络协议 TCP/IP协议 三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? UDP协议 HTTP协议 Socke ...

最新文章

  1. 中式古建筑su模型大全
  2. 解决android unable to resolve new-instance问题
  3. Navicat(连接) -1之SSL 设置
  4. linux内核驱动之 驱动程序的角色
  5. linux 的FAQ
  6. [排错] Status error 2850
  7. epson连接计算机后无法打印,如何解决连接到Epson打印机后计算机无法打印的问题...
  8. qt:qt5.12警告消除大法之 warning: zero as null pointer constant
  9. 题解 P1757 【通天之分组背包】
  10. eulerOS 欧拉OS 审计修复日记
  11. 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例
  12. 2022年秋招 Java后端程序员如何应对面试?
  13. 计算机数值中的乘法除法原理
  14. 大数据小结(1-4)
  15. (九)巴菲特与索罗斯的投资习惯:术业有专攻
  16. 进不去系统rpc服务器不可用,WinXP系统RPC服务器不可用怎么办?
  17. @pack://application:,,,/报错
  18. cydia崩溃如何解决,清理cydia的方法!
  19. 基于ArcGIS的Python编程秘笈笔记(三):自动化地图制图和打印
  20. 如何开发自己的电子地图系统 web版 单机或联网

热门文章

  1. python内存技巧_使用__slots__节省python内存技巧
  2. 此上下文中不允许函数定义。_彻底搞懂上下文this,轻松应对,一面就过!!!...
  3. 软工实践-第二次会议
  4. 顺利通过EMC实验(9)
  5. EventBus猜想 ----手把手带你自己实现一个EventBus
  6. CSS中文乱码解决方法
  7. SQL ROUND函数用法
  8. (转载)linux中编译安装log4cpp
  9. Lisp的本质(The Nature of Lisp)
  10. java 蓝桥杯算法训练 未名湖边的烦恼