java反射机制通过class对象在运行时检查和操作类结构,包括三种获取class方式、构造器/字段/方法的获取与调用,且私有成员需setaccessible(true)绕过访问控制。

Java 反射机制允许程序在运行时检查、访问和操作类的结构,包括构造器、属性(字段)和方法。关键前提是先获取目标类的 Class 对象,再调用对应 API 获取所需成员。
一、获取 Class 对象的三种可靠方式
所有反射操作都始于 Class 实例:
-
对象引用调用
.getClass():适用于已有实例,如new User().getClass() -
类字面量
User.class:编译期已知类型,安全高效,推荐用于工具类或泛型场景 -
Class.forName("全限定类名"):支持字符串动态加载,常用于配置驱动、插件系统;需捕获ClassNotFoundException
二、获取并操作构造器(Constructor)
构造器分为公有与私有两类,API 区分明确:
-
getConstructors():仅返回 public 构造器(含父类继承的 public 构造器) -
getDeclaredConstructors():返回本类声明的所有构造器(无视访问修饰符,含 private) -
getConstructor(Class...):按参数类型精确匹配一个 public 构造器 -
getDeclaredConstructor(Class...):按参数类型匹配本类任意访问级别的构造器
使用示例(创建私有无参构造实例):
Constructor> ctor = clazz.getDeclaredConstructor(); ctor.setAccessible(true); // 绕过访问控制 Object obj = ctor.newInstance();
三、获取并操作属性(Field)
字段访问同样区分可见性范围:
-
getFields():只返回本类及父类中 public 字段 -
getDeclaredFields():返回本类声明的全部字段(private、protected、default、static 均包含) -
getField(String name):按名称获取 public 字段(跨类继承也生效) -
getDeclaredField(String name):按名称获取本类任意字段
读写私有字段前必须调用 setAccessible(true),否则抛 IllegalAccessException。
常用字段信息提取:
-
field.getName()→ 字段名 -
field.getType()→ 字段类型(返回Class) -
field.getModifiers()→ 修饰符整数,配合Modifier.toString()转为可读字符串
四、获取并调用方法(Method)
方法反射的核心是 invoke(),但获取阶段需注意匹配规则:
-
getMethods():返回本类及所有父类中的 public 方法(含继承) -
getDeclaredMethods():返回本类声明的全部方法(无视修饰符) -
getMethod(String name, Class...):查找 public 方法,参数类型必须严格匹配 -
getDeclaredMethod(String name, Class...):查找本类任意访问级别的方法
调用步骤:
- 获取 Method 对象(必要时设
setAccessible(true)) - 准备目标对象(静态方法传
null) - 准备参数数组(基本类型需包装,如
int→Integer) - 执行
method.invoke(obj, args),返回值为Object类型
额外信息可查:method.getReturnType()、method.getParameterTypes()、method.getExceptionTypes()。










