反射是Java在运行时动态获取类信息并操作属性和方法的机制。通过Class对象获取类结构,可创建实例、访问私有成员、调用方法,常用于框架开发、注解处理等场景,但存在性能开销与安全风险。

反射是Java中一种强大的机制,它允许程序在运行时动态地获取类的信息,并操作类的属性和方法。这种能力突破了编译时的限制,使代码更具灵活性,尤其在框架开发、注解处理和动态代理等场景中广泛使用。
什么是反射?
Java的反射机制指的是在程序运行过程中,可以:
- 获取任意类的完整构造信息(如类名、父类、实现接口)
- 创建对象实例,即使在编译时不知道具体类型
- 访问和修改字段值,包括私有字段
- 调用对象的方法,包括私有方法
这一切都基于java.lang.Class类和java.lang.reflect包中的API实现。
如何通过反射操作类
要使用反射,第一步是获取类的Class对象。有三种常见方式:
立即学习“Java免费学习笔记(深入)”;
- 类名.class:如String.class
- 对象.getClass():如new String().getClass()
- Class.forName("全限定类名"):如Class.forName("java.util.ArrayList")
拿到Class对象后,就可以查询类的结构:
- getConstructors() 获取公共构造器
- getDeclaredFields() 获取所有字段(含私有)
- getMethods() 获取公共方法(含继承)
- getDeclaredMethods() 获取本类所有方法(不含继承)
如何通过反射调用方法
假设有一个类Person,包含一个私有方法sayHello:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
class Person {
private void sayHello() {
System.out.println("Hello from Person!");
}
}
通过反射调用该方法的步骤如下:
- 获取Class对象:Class> clazz = Person.class;
- 创建实例:Object obj = clazz.newInstance();
- 获取方法对象:Method method = clazz.getDeclaredMethod("sayHello");
- 设置可访问性:method.setAccessible(true);(绕过private限制)
- 执行方法:method.invoke(obj);
这样就能成功调用原本无法直接访问的方法。
反射的实际用途与注意事项
反射常用于以下场景:
- Spring框架通过反射实现依赖注入
- JSON序列化库(如Jackson)利用反射读取对象字段
- 插件化系统加载外部jar中的类并调用
但也要注意:
- 性能开销较大,频繁调用需缓存Method或Field对象
- 破坏封装性,可能引发安全问题
- 编译器无法检查反射调用的正确性,容易出错
基本上就这些。理解反射的关键是掌握Class对象的作用以及如何通过它“打开”类的内部结构。虽然不常在业务代码中直接使用,但它是很多高级功能的基础。









