最通俗的方式给你讲Java反射。
想象你有一个"万能遥控器",可以:
- 遥控任何牌子的电视(操作任意类)
- 即使说明书丢了也能用(不需要源代码)
- 还能临时给电视加新功能(动态创建对象/调用方法)
这个遥控器就是反射。
举个生活中的例子
你去朋友家玩,发现他家有个新款扫地机器人。虽然你没见过这个型号,但你可以:
- 先观察它(获取Class对象)
- 按按钮试功能(getMethod→invoke)
- 发现隐藏功能(比如"唱歌"模式,原本是private的)
代码看热闹版
java
// 正常方式:像用遥控器说明书
Dog dog = new Dog();
dog.eat(); // 必须提前知道Dog有eat方法
// 反射方式:像盲操遥控器
Class c = Class.forName("Dog"); // 先找到这个类
Object obj = c.newInstance(); // 临时造一个狗
Method m = c.getMethod("eat"); // 摸索出eat按钮
m.invoke(obj); // 遥控狗吃饭
反射能干嘛?
- 暴力破解:强行访问private成员(比如修改String的值)
- 动态加载:程序运行时突然说"我要加个MySQL驱动",反射能现场加载
- 解耦神器:Spring说"我不管你的类叫UserService还是UserDao,配置里写啥我就给你造啥"
注意!
反射就像拆弹工具:
- 功能强但危险(破坏封装性)
- 慢(像戴厚手套操作)
- 适合框架开发,日常业务代码慎用
一句话总结:反射是Java的"后门",让你运行时透视和操作类,但别拿它当常规武器用。