Java反射中,getFields()/getMethods()获取public成员(含继承),getDeclaredFields()/getDeclaredMethods()获取本类声明的所有成员(含private);访问private成员需setAccessible(true),遍历和筛选需注意异常处理与条件匹配。

Java 反射机制可以通过 Class 对象获取类的字段(Field)和方法(Method),并进行遍历操作。关键在于区分“声明的”和“可访问的”成员,以及是否需要处理私有成员。
获取所有公共字段和方法(含父类继承的)
使用 getFields() 和 getMethods(),它们只返回 public 且可被当前类访问的成员(包括从父类、接口继承的 public 成员):
-
clazz.getFields()→ 返回Field[],仅包含 public 字段(不含 private/protected/private static) -
clazz.getMethods()→ 返回Method[],仅包含 public 方法(含从 Object 继承的如toString())
获取本类声明的所有字段和方法(无视访问修饰符)
使用 getDeclaredFields() 和 getDeclaredMethods(),它们返回当前类**显式定义**的全部字段/方法,无论 private、protected 还是 package-private:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 返回结果不包含父类或接口中的成员
- 若需访问 private 成员,需先调用
setAccessible(true)突破访问控制检查 - 例如:
field.setAccessible(true); Object value = field.get(obj);
遍历并安全处理字段与方法示例
推荐按需选择 API,并注意异常处理(IllegalAccessException、InvocationTargetException 等):
立即学习“Java免费学习笔记(深入)”;
- 遍历本类所有字段(含 private):
for (Field f : clazz.getDeclaredFields()) {
f.setAccessible(true); // 如需读写值
System.out.println(f.getName() + " : " + f.getType());
} - 遍历本类所有方法(含重载):
for (Method m : clazz.getDeclaredMethods()) {
System.out.println(m.getName() + "(" + Arrays.toString(m.getParameterTypes()) + ")");
}
过滤和查找特定成员的技巧
反射结果是数组,可用 Stream 或传统循环配合条件筛选:
- 查找名为
"id"的字段:Arrays.stream(clazz.getDeclaredFields()).filter(f -> "id".equals(f.getName())).findFirst() - 查找带某个注解的方法:
m.isAnnotationPresent(Override.class) - 按参数类型匹配方法:
method.getParameterCount() == 1 && method.getParameterTypes()[0] == String.class

















