getField和getDeclaredField有什么区别
时间: 2023-07-29 09:11:32 浏览: 58
在 Java 的反射 API 中,getField 和 getDeclaredField 方法都可以用来获取类的字段对象,但它们有以下两个主要的区别:
1.访问权限:getField 方法只能获取到类中的 public 字段,而 getDeclaredField 方法可以获取到类中所有的字段,包括 public、protected、default 和 private 字段。
2.继承性:getField 方法只能获取到类本身和其父类中的 public 字段,而 getDeclaredField 方法只能获取到类本身声明的所有字段,不能获取其父类中的字段。
下面是一个示例代码,演示了 getField 和 getDeclaredField 方法的区别:
```java
class Parent {
public int publicField;
protected int protectedField;
int defaultField;
private int privateField;
}
class Child extends Parent {
public int childField;
}
public class Main {
public static void main(String[] args) throws Exception {
Class<Child> childClass = Child.class;
// 使用 getField 获取 public 字段
Field publicField = childClass.getField("publicField");
System.out.println(publicField);
// 使用 getDeclaredField 获取 public/protected/default/private 字段
Field protectedField = childClass.getDeclaredField("protectedField");
System.out.println(protectedField);
Field defaultField = childClass.getDeclaredField("defaultField");
System.out.println(defaultField);
Field privateField = childClass.getDeclaredField("privateField");
System.out.println(privateField);
// 使用 getField 获取继承来的 public 字段
Field parentPublicField = childClass.getField("childField");
System.out.println(parentPublicField);
}
}
```
在上面的示例代码中,Child 继承自 Parent 类,Parent 类中有四个字段,分别是 publicField、protectedField、defaultField 和 privateField。Child 类中有一个字段 childField。
我们可以看到,使用 getField 方法只能获取到 publicField 字段,而使用 getDeclaredField 方法可以获取到所有的字段。此外,使用 getField 方法也可以获取到 childField 字段,因为该字段是从父类继承而来的 public 字段。