反射回答面试官问题的时候可以不用这么一问一答的方式比如在讲了什么是反射之后我们就可以顺手的提一下为什么反射的性能这么低以及反射的优缺点那你既然说了这么多你知道怎么去用反射去创建一个对象吗【补】如果前面在回答的过程中提到了底层框架用到了反射那你可以提一下底层框架的哪些地方用到了反射什么是反射反射就是 Java 在运行期间动态获取类的信息并操作类的属性、方法和构造方法的机制。比如可以通过类名获取Class对象再创建对象、调用方法、修改字段。 它的优点是灵活常用于框架底层比如 Spring缺点是性能相对差并且会破坏封装性。反射为什么性能这么低反射性能低主要是因为它是运行时动态解析和调用不像普通方法调用那样在编译期就确定好。普通方法调用可以被 JVM 优化比如内联而反射调用需要做权限检查、方法查找、参数封装和类型校验这些都会带来额外开销。 所以反射更适合框架层使用不适合在高频业务逻辑里大量调用。反射的优缺点是什么反射的优点是灵活性高可以在运行时动态创建对象、调用方法、访问属性所以很多框架比如 Spring、MyBatis 底层都会用到反射。缺点是性能比普通调用低因为需要运行时解析、权限检查和类型校验另外反射可以访问私有成员可能会破坏封装性代码可读性和安全性也会变差。所以说还是要先去获取一下对应类的class对象你都知道有哪些方式吗获取Class对象的三种方式是什么各自的区别是什么获取Class对象主要有三种方式第一种是Class clazz User.class;这种方式最安全编译期就能检查一般最常用。第二种是Class clazz user.getClass();这种方式必须先有对象获取的是运行时对象的真实类型。第三种是Class clazz Class.forName(com.xxx.User);这种方式通过类的全限定名获取会触发类加载常用于配置文件、框架或 JDBC 场景。所以前面我们获取了class对象的主要目的就是为了在这个地方用反射的方式来创建一个对象如何通过反射创建一个对象通过反射创建对象一般是先获取Class对象再获取构造方法最后调用newInstance()。【无参构造】ClassUser clazz User.class; User user clazz.getDeclaredConstructor().newInstance();如果是有参构造可以这样ConstructorUser constructor clazz.getDeclaredConstructor(String.class, int.class); User user constructor.newInstance(张三, 18);现在更推荐用getDeclaredConstructor().newInstance()不推荐直接用clazz.newInstance()因为后者已经不建议使用了。既然你都知道用反射去创建一个对象了那么怎么用反射来调用私有字段和私有方法呢如何通过反射调用私有字段和私有方法可以通过getDeclaredField()和getDeclaredMethod()获取私有成员然后调用setAccessible(true)关闭 Java 的访问检查。ClassUser clazz User.class; User user new User(); Field field clazz.getDeclaredField(name); field.setAccessible(true); field.set(user, 张三); Method method clazz.getDeclaredMethod(sayHello); method.setAccessible(true); method.invoke(user);简单说getDeclaredXxx()可以获取本类中声明的私有成员setAccessible(true)让反射可以访问私有属性或方法。你前面提到了底层框架会用反射那你说说Springmybatis哪些地方用到了反射Springmybatis哪些地方用到了反射Spring 中反射主要用在Bean 的创建、属性注入、方法调用上。比如 Spring 根据类的Class对象通过反射调用构造方法创建 Bean然后通过反射给Autowired、Value标注的字段或方法赋值AOP、注解解析、生命周期方法调用也会用到反射。MyBatis 中反射主要用在对象映射上比如把数据库查询结果封装成 Java 对象时会通过反射创建对象并调用 setter 方法或直接给字段赋值。 简单说Spring 用反射管理对象MyBatis 用反射封装结果。异常既然聊到了异常请你说说 Error和Exception的区别以及对应的有哪些异常/错误那请你说说你会怎么去进行处理throw和throws的区别是什么Error和Exception的区别Error和Exception都继承自Throwable但含义不一样。Error表示程序无法处理的严重问题比如OutOfMemoryError内存溢出、StackOverflowError栈溢出错误一般不建议捕获。Exception表示程序可以处理的异常情况比如空指针、IO 异常、数据库异常通常需要通过try-catch或抛出处理。简单说Error 是系统级严重错误Exception 是程序级异常。常见的Error/Exception有哪些常见的Error有OutOfMemoryError内存不足。StackOverflowError栈溢出常见于递归太深。NoClassDefFoundError运行时找不到类。ClassFormatError类文件格式错误。常见的Exception有NullPointerException空指针异常。ArrayIndexOutOfBoundsException数组越界。ClassCastException类型转换异常。NumberFormatException数字格式转换异常。IOExceptionIO 异常。SQLException数据库异常。简单说Error 偏JVM或系统级问题Exception 偏代码运行中的可处理问题。throw和throws的区别throw是在方法内部主动抛出一个具体异常对象。throw new RuntimeException(参数错误);throws是写在方法声明上表示这个方法可能会抛出某些异常让调用者处理。public void readFile() throws IOException { }简单说throw 是真正抛异常throws 是声明可能抛异常。除了throw抛出的异常请你聊聊你对於try-catch-finally的执行顺序的理解try-catch-finally的执行顺序try-catch-finally的执行顺序是先执行 try如果 try 中出现异常就执行对应的 catch最后一定会执行 finally。如果try中没有异常顺序就是try → finally如果try中有异常并被捕获顺序就是try → catch → finally需要注意finally一般都会执行常用于释放资源比如关闭流、数据库连接等。只有极端情况比如System.exit()或 JVM 崩溃finally才可能不执行。finally中的代码一定会被执行吗不一定。正常情况下finally基本都会执行比如try中有return、有异常finally也会先执行。但有几种特殊情况不会执行比如System.exit(0);或者 JVM 崩溃、线程被强制杀死、机器断电等。所以面试里可以说finally 通常一定执行但不是绝对一定执行。finally 块中如果有 return 语句会发生什么如果finally块中有return它会覆盖 try 或 catch 中的 return 结果。比如try { return 1; } finally { return 2; }最终返回的是2。所以实际开发中不建议在finally里写return因为它可能会吞掉异常或改变原本的返回结果导致问题很难排查。既然你都已经知道异常应该怎么去进行处理了那请你说一说不同的异常之间的区别NoClassDefFoundError 和 ClassNotFoundException 的区别ClassNotFoundException是受检异常一般发生在程序通过反射或类加载器主动加载类时比如Class.forName(com.xxx.User);如果类路径下找不到这个类就会抛ClassNotFoundException。NoClassDefFoundError是Error通常是编译时类存在但运行时类丢失、依赖缺失导致 JVM 加载失败。简单说ClassNotFoundException是主动加载找不到类NoClassDefFoundError 是运行时依赖类缺失。OutOfMemoryError 和 StackOverflowError 分别是什么原因导致的OutOfMemoryError是堆内存或方法区等内存不足导致的比如创建了大量对象、集合一直增长、内存泄漏等。StackOverflowError是线程栈空间耗尽导致的最常见原因是递归调用太深或者递归没有出口。简单说OOM是内存不够用StackOverflow是方法调用栈太深。