当前位置: 首页 > news >正文

吃透Java反射(面试必看)

一、前言

Java反射是Java高级特性中的核心知识点,也是框架开发(如Spring、MyBatis)的底层基石。它允许程序在运行时动态获取类的元信息(字段、方法、构造器),并操作类的私有成员,极大地提升了代码的灵活性。

本文将结合实战案例,从反射的核心类、关键方法讲起,重点解析instanceof 与 getClass的区别,帮助你彻底掌握反射的核心应用场景。

二、Java反射核心知识点梳理

2.1 反射的核心类

Java反射的操作依赖于 java.lang.reflect 包下的三个核心类,以及根类 Class :

1. Class类:反射的入口,代表类的元信息,可通过 getClass() 、 Class.forName() 、 类名.class 三种方式获取。

2. Method类:代表类的方法,可通过 getDeclaredMethods() 获取所有方法(含私有), getMethods() 获取公共方法(含继承)。

3. Field类:代表类的字段,可通过 getDeclaredField() 获取指定字段(含私有)。

4. Constructor类:代表类的构造器,用于通过有参构造创建对象。

2.2 访问私有成员的关键步骤

反射突破访问权限的核心是 setAccessible(true) ,以访问私有方法为例:

java

import java.lang.reflect.Method;

public class ReflectPrivateMethod {

static class Test {

private void sayHello(String name) {

System.out.println("Hello, " + name);

}

}

public static void main(String[] args) throws Exception {

// 1. 获取Class对象

Class<Test> testClass = Test.class;

// 2. 创建实例

Test test = testClass.newInstance();

// 3. 获取私有方法(参数:方法名,参数类型)

Method sayHelloMethod = testClass.getDeclaredMethod("sayHello", String.class);

// 4. 取消访问检查

sayHelloMethod.setAccessible(true);

// 5. 调用方法(参数:实例,方法参数)

sayHelloMethod.invoke(test, "Java反射");

}

}

运行结果: Hello, Java反射

三、instanceof 与 getClass 深度对比

在反射中,判断对象类型是高频操作, instanceof 和 getClass() 是两种常用方式,但适用场景完全不同。

3.1 核心区别

特性 instanceof getClass()

判断逻辑 判断对象是否是某个类或其子类的实例 返回对象实际所属类的Class对象

对比方式 实例 instanceof 类/接口 obj.getClass() == 类.class

是否考虑继承 是 否

3.2 实战案例解析

我们通过一个继承案例,直观感受两者的区别:

java

class Animal {}

class Dog extends Animal {}

public class TypeJudgeTest {

public static void main(String[] args) {

Animal o1 = new Animal();

Animal o2 = new Dog(); // 向上转型

// 1. instanceof 判断

System.out.println(o2 instanceof Animal); // true:Dog是Animal的子类

// 2. getClass() 判断

System.out.println(o2.getClass() == o1.getClass()); // false:o2实际是Dog,o1实际是Animal

}

}

运行结果:

plaintext

true

false

3.3 适用场景

1. 使用 instanceof:当你需要判断对象是否属于某个类型体系(包括父类、接口)时,例如:

- 集合中判断元素是否是某个接口的实现类(如 list.get(0) instanceof Comparable )。

2. 使用 getClass():当你需要精确判断对象的实际类型时,例如:

- 反射中动态获取对象的真实类型,以调用对应的方法。

四、常见面试题与易错点

4.1 面试题1:反射可以访问私有成员,是否破坏了Java的封装性?

答:没有完全破坏。反射访问私有成员需要显式调用 setAccessible(true) ,这是一种可控的突破,且仅在运行时生效。Java通过这种设计,在保证封装性的同时,为框架开发提供了灵活性。

4.2 面试题2:无参构造方法缺失时,如何通过反射创建对象?

答:通过 Constructor 类实现。先获取指定参数类型的构造器,再调用 newInstance() 传入参数:

java

Class<Dog> dogClass = Dog.class;

Constructor<Dog> constructor = dogClass.getDeclaredConstructor(String.class);

Dog dog = constructor.newInstance("旺财");

4.3 易错点

1. 调用私有成员前未调用 setAccessible(true) ,会抛出 IllegalAccessException 。

2. 混淆 getDeclaredMethods() 和 getMethods() ,前者获取所有方法,后者仅获取公共方法(含继承)。

五、总结

本文从反射的核心类、私有成员访问步骤讲起,重点对比了 instanceof 与 getClass() 的区别,并结合实战案例和面试题进行解析。掌握这些知识点,不仅能应对日常开发中的动态操作需求,也能在面试中脱颖而出。

反射的应用远不止于此,后续我会继续分享反射在框架开发中的高级应用,欢迎关注!

http://www.jsqmd.com/news/165901/

相关文章:

  • 通过剖析了谷歌的AI排名信号:发现关于搜索的5个惊人真相
  • HTML动态图表展示:Miniconda环境下使用Bokeh实战
  • 小迪安全_第4天:基础入门-30余种加密编码进制Web数据库系统代码参数值|小迪安全笔记|网络安全|
  • 漏洞挖掘指南:小白进阶实战「数字侦探」,月入 3 万核心技能全解析
  • 元旦福利变现指南,永辉超市购物卡高效回收攻略 - 京顺回收
  • X1500型双轴撕碎机结构设计
  • 超越合规:如何通过系统性安全审计,真正构建主动防御能力?
  • 实用程序:Python打造进程网络监控与分析工具——全方位掌握你的网络与进程状态
  • GitHub Action缓存依赖:Miniconda-Python3.9镜像加速CI构建
  • 小迪安全笔记_第4天|扩展整理|30+种加密编码进制全解析:特点、用处与实战识别指南|小迪安全笔记|网络安全|
  • 2025年成都靠谱西餐培训学校排行榜,新测评精选学做西餐培训学校推荐 - myqiye
  • 多工作台石材切机设计
  • 2025锡膏冷藏柜厂家推荐,实力盘点 - 栗子测评
  • SRC视角下:渗透测试中的逻辑漏洞思路一览,黑客技术零基础入门到精通实战教程!
  • 靠 Python 搞黑客?不,是成为安全专家:网络渗透与防御实战教程
  • Python自动化软件测试怎么学?路线和方法都在这里了
  • Jupyter Notebook远程访问配置指南(Miniconda-Python3.9镜像适用)
  • 2025锡膏柜哪家好?锡膏机推荐及解析 - 栗子测评
  • 零基础学黑客技术:一文帮你避开90%的坑,快速掌握高效进阶学习路径!
  • Bagging vs Boosting:谁才是最强“抱团”算法?
  • 2025年坡口机厂家实力推荐榜:深圳凯德盛,管道/内涨式/钢板/便携式坡口机全系供应 - 品牌推荐官
  • 2025年窑密封厂家权威榜单推荐:烘干窑/氧化锌窑/锂电处理窑/高温旋转窑/氧化铝窑/回转窑/油泥处理窑密封源头厂家精选 - 品牌推荐官
  • 功能测试转测开容易吗
  • Postman设置接口关联,实现参数化
  • AI抠图:高效精准提取主体的实用技巧与实操指南
  • 2025年推荐企业AI智能体官网厂家排行榜:优质源头厂家有哪些? - 工业品网
  • 2025防水连接器哪家好大揭秘:认准这份航空插头厂家推荐清单 - 栗子测评
  • 川西林海胜境,龙苍沟的碧水与白鸽花
  • 弱网测试及常用模拟工具
  • Jmeter压测详解