访问量 ... 次
访客数 ... 人
想象你走进一个神秘房间,房间里摆满了上锁的宝箱。正常情况下你需要对应的钥匙才能打开每个箱子,但突然你获得了一个万能开锁器,这个“万能开锁器”就类似于是Java反射!
反射允许你在程序运行时动态地获取类的信息(如方法、字段等),甚至可以调用这些方法或访问这些字段,即使它们被声明为private
。
这意味着你可以像拥有X光视力一样,“透视”任何对象的内部构造,并根据需要调整或操作它们。
🔍 反射的主要能力:
private
关键字的限制,调用和修改私有方法。new
关键字即可实例化对象。final
关键字,动态修改对象的属性值。Java反射在许多场景中都有广泛的应用,主要包括以下方面:
@Autowired
注解;
// Spring内部通过反射实现的依赖注入
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Autowired.class)) {
Object dependency = context.getBean(field.getType());
field.setAccessible(true);
field.set(bean, dependency);
}
}
// 动态代理示例
Object proxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
(proxy, method, args) -> {
System.out.println("【前置通知】");
return method.invoke(target, args);
}
);
虽然反射提供了极大的灵活性,但它并非没有代价,频繁地使用反射可能会导致程序性能下降:
✅反射推荐场景:
❌ 反射慎用场景:
✨ 反射就像程序员手中的量子纠缠装置,让代码能够突破时空限制与运行时环境对话。记住:能力越大,责任也越大