Java大厂面试全覆盖:30+反射、注解、IO高频面试题详解(含腾讯/阿里/美团/百度真题)
1. 什么是Java反射?
考察知识点:反射机制原理。
Java反射是一种在运行时动态获取类的信息,并操作类对象、方法和属性的机制。通过反射,程序可以加载未知类,动态创建对象,调用方法,访问属性,极大提高了Java的灵活性和扩展性。
2. 反射的常用类有哪些?
考察知识点:反射API。
主要有Class、Field、Method、Constructor四个核心类。Class用于描述类本身,Field代表成员变量,Method代表方法,Constructor代表构造方法。
3. 如何获取Class对象?
考察知识点:Class对象获取方式。
有三种方式:1)Class.forName("类全名"); 2)对象.getClass(); 3)类名.class。推荐静态加载用类名.class,动态加载用Class.forName。
4. 反射创建对象的方式?
考察知识点:实例化对象。
通过Class对象的newInstance()方法(已过时,推荐getDeclaredConstructor().newInstance()),可以动态创建实例。也可以通过Constructor对象的newInstance()创建对象。
5. 如何通过反射调用方法?
考察知识点:Method对象。
先通过Class的getMethod/getDeclaredMethod获取Method对象,再调用invoke方法进行调用。支持传递参数、访问私有方法需setAccessible(true)。
6. 反射访问属性的方式?
考察知识点:Field对象。
用Class的getField/getDeclaredField获取Field对象,通过get/set方法获取或设置属性值。访问私有属性需setAccessible(true)。
7. 反射和普通调用的区别?
考察知识点:性能和应用场景。
反射是动态调用,性能略低于普通调用,但灵活性高。常用于框架开发、通用代码、依赖注入等场景。
8. 反射机制的优缺点?
考察知识点:反射的影响。
优点是灵活、解耦、适合通用框架。缺点是性能开销较大、类型安全性弱、可能破坏封装性。
9. 如何获取泛型信息?
考察知识点:泛型反射。
可通过Field的getGenericType、Method的getGenericReturnType等方法获取泛型类型信息,常用于ORM/序列化等框架。
10. 反射如何访问私有成员?
考察知识点:可访问性。
通过field/method/constructor对象的setAccessible(true)临时关闭Java的访问检查,从而操作私有成员。
11. 反射能否操作静态成员?
考察知识点:静态成员访问。
可以。只需传null作为对象实例即可操作静态字段和方法。
12. 如何通过反射获取类的注解?
考察知识点:注解反射。
用Class/Field/Method对象的getAnnotation(s)方法获取注解实例,通过注解实例读取注解参数。
13. 注解的分类?
考察知识点:元注解与自定义注解。
分为内置注解(如@Override、@Deprecated)、元注解(如@Retention、@Target)和自定义注解。元注解用于描述注解的作用范围和生命周期。
14. 如何自定义注解?
考察知识点:注解定义及参数。
用@interface声明,支持参数、默认值。可通过元注解指定作用域(@Target)、保留策略(@Retention)。
15. 注解的保留策略有哪些?
考察知识点:@Retention。
有SOURCE(源码级)、CLASS(编译期,默认)、RUNTIME(运行时可反射获取)。大多数框架注解用RUNTIME。
16. 注解的作用范围?
考察知识点:@Target。
@Target指定注解可用在类、方法、字段、参数、局部变量等位置,常见ElementType有TYPE、METHOD、FIELD等。
17. 如何读取方法、字段上的注解?
考察知识点:反射读取注解。
通过Method/Field对象的getAnnotation方法获取注解实例,再获取注解参数值。支持多注解或重复注解。
18. 常用的JDK注解有哪些?
考察知识点:标准注解。
@Override(重写)、@Deprecated(弃用)、@SuppressWarnings(压制警告)、@FunctionalInterface、@SafeVarargs等。
19. 注解与反射的结合应用举例?
考察知识点:框架设计。
如Spring、MyBatis等框架通过注解+反射动态扫描类、方法、字段,实现依赖注入、自动装配、ORM映射等功能。
20. 注解处理器(APT)是什么?
考察知识点:编译期注解处理。
APT(Annotation Processing Tool)在编译期扫描注解并生成代码或校验,常用于自动化代码生成、依赖注入等。
21. 什么是Java IO?
考察知识点:IO基础。
Java IO用于数据的输入/输出操作,包括文件、网络、内存等。分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)。
22. 字节流和字符流区别?
考察知识点:IO流分类。
字节流(InputStream/OutputStream)按字节处理适合所有数据;字符流(Reader/Writer)按字符处理,适合文本,自动处理编码转换。
23. File类的常用方法?
考察知识点:文件操作。
File类支持文件/目录的创建、删除、重命名、判断存在、获取路径、遍历目录等操作。是IO操作的基础。
24. BufferedInputStream和BufferedReader区别?
考察知识点:缓冲流。
BufferedInputStream是字节缓冲流,提高字节读写效率;BufferedReader是字符缓冲流,支持按行读取文本,效率高且易用。
25. Java IO如何高效读取大文件?
考察知识点:缓冲、分块。
推荐使用Buffered流进行缓冲,或用FileChannel、MappedByteBuffer进行分块读写,提升大文件处理效率。
26. 对象序列化和反序列化?
考察知识点:ObjectInputStream/ObjectOutputStream。
对象需实现Serializable接口,ObjectOutputStream写对象到文件,ObjectInputStream反序列化恢复对象。可用于持久化、网络传输。
27. NIO与IO的区别?
考察知识点:新IO特性。
NIO为非阻塞IO,基于缓冲区和通道,支持Selector多路复用,适合高并发。IO为阻塞IO,基于流。
28. Java NIO的核心组件?
考察知识点:Channel、Buffer、Selector。
Channel负责数据传输,Buffer负责数据存储,Selector实现多路复用。三者协作实现高效IO。
29. FileChannel的用途?
考察知识点:NIO文件操作。
FileChannel支持高效的文件读写、内存映射、数据传输等,可实现大文件分块/零拷贝操作。
30. MappedByteBuffer的原理?
考察知识点:内存映射文件。
MappedByteBuffer可将文件的部分或全部直接映射到内存,支持高效读写大文件,减少操作系统切换。
31. NIO的多路复用机制?
考察知识点:Selector。
Selector可监听多个Channel事件,实现单线程管理多连接,极大提升并发处理能力,常用于高性能网络编程。
32. 管道(Pipe)和缓冲区(Buffer)的区别?
考察知识点:NIO组件。
Pipe用于线程间单向通信,Buffer用于数据的读写存储。二者在NIO中协同工作。
33. IO流的关闭和资源释放?
考察知识点:资源管理。
应通过try-with-resources自动关闭流,防止资源泄漏;手动关闭需catch异常,保证finally中close操作。
34. 常见IO异常处理方式?
考察知识点:异常与健壮性。
应捕获IOException,合理处理文件不存在、权限不足、网络中断等异常,保证应用健壮性。
以上题目涵盖了大厂Java反射、注解、IO相关的高频和基础知识点,建议结合源码和实际项目深入理解与掌握,知其然且知其所以然,助力高分通过面试!