| |
|
开发:
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 调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在使用数组的操作中。数组的初始化是对数组分配现需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话) 排查步骤:
java.lang.ClassNotFoundException 当 JVM 尝试加载一个特定的类,而在 ClassPath 路径没有发现这个类的 Class 文件时会抛出该异常。使用 Class.forName() 加载类,该类的 Class 文件不在 ClassPath 路径 排查步骤:
java.lang.ArithmeticException 数学算术异常 排查步骤:
java.lang.ArrayIndexOutOfBoundsException 数组下标越界 排查步骤:
java.lang.IllegalArgumentException 方法参数错误,通常是缺少参数,或者参数类型、顺序不匹配 排查步骤:
java.lang.IllegalAccessException 非法访问,通常是没有权限访问,比如说使用反射机制访问类的私有成员时 排查步骤:
java.lang.StackOverflowError 堆栈溢出,当一个递归调用的层次太深或者死循环会导致该异常 排查步骤:
java.lang.ClassCastException 类型转换异常,是 JVM 在检测到两个类型间转换不兼容时引发的运行时异常 排查步骤:
2.模拟面试的时候被问及平时你遇到过哪些异常? 空指针异常、数组下标越界、算术异常、堆栈溢出异常、ClassNotFound、类型转换异常、方法参数错误,还有非法访问异常 对于空指针异常你是怎么进行排查的? 空指针异常通常会在控制台会打印堆栈信息,从中可以找到错误的根源,然后查看根源是不是自己忘记创建对象就使用变量了 二、什么情景下会用到反射1.分析Java 反射主要提供以下功能:
不使用反射的理由:
不得不使用反射的场景:
常见场景:
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反射机制的应用场景 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/30 13:58:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |