IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【面试】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理 -> 正文阅读

[Java知识库]【面试】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理

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

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

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. 检查是否声明了错误的类型

2.模拟面试的时候被问及

平时你遇到过哪些异常?

空指针异常、数组下标越界、算术异常、堆栈溢出异常、ClassNotFound、类型转换异常、方法参数错误,还有非法访问异常

对于空指针异常你是怎么进行排查的?

空指针异常通常会在控制台会打印堆栈信息,从中可以找到错误的根源,然后查看根源是不是自己忘记创建对象就使用变量了

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

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 代理需要使用反射技术在运行时创建代理对象

2.模拟面试的时候被问及

你觉得什么时候需要用到反射?

反射技术主要的功能是能够在运行时判断一个对象所属的类并且创建,还可以判断一个类具有的所有成员并且调用成员方法。因此,我们如果有上面这些需求就可以使用反射。比如 JDBC 连接数据库时使用 Class.forName 注册驱动时用到反射技术在运行时创建对象。Spring 通过 XML 配置模式装载 Bean 的最后一步用到了反射技术动态地配置实例属性。动态代理的 JDK 代理也需要使用反射技术在运行时创建代理对象

那反射技术有什么缺点吗?

第一点是性能问题,它的执行过程就相当于一系列的解释操作,一步一步告诉 JVM 要做什么,反射机制中包含了一些动态类型,JVM 无法对这些动态代码进行优化,因此反射的效率会比较低。第二点是安全限制,反射通常需要程序的运行没有安全方面的限制。最后是程序健壮性的问题,反射技术允许程序执行一些通常不被允许的操作,比如说可以调用一个类的私有成员,破坏了 Java 的抽象性,可能会导致意想不到的后果。

三、反射的底层原理

1.原理

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

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

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

2.模拟面试的时候被问及

为什么反射可以访问其他类的私有成员?底层原理是什么?

方法层面上来说是因为调用了 setAccessible() 方法,使得可以访问其他类的私有成员。从底层原理上来讲,要实现反射技术,就要具有动态编译能力和获取类信息的能力,Java 具有动态编译能力,而获取信息的能力由底层的 C++ 代码实现,C++ 代码可以直接获取全部的类信息,那么自然也可以选择无视 private 的限制


参考链接

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

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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 11:51:51  更:2021-08-07 11:54:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 18:34:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码