getfield和getdeclaredfield的区别
在Java编程中,我们经常需要与类中的字段进行交互,Java提供了多种方法来获取字段信息,其中getfield和getdeclaredfield是两种比较常用的。本文将介绍这两者的区别。
getfield
getfield方法是Java反射机制提供的一种方法,用于获取一个类或者对象的指定的公共字段(public field)的值。该方法属于Class类中的方法,其语法如下:
public Field getField(String name) throws NoSuchFieldException, SecurityException
参数name指定了需获取的字段名称,如果该字段为公共字段,则返回Field对象。如果未找到该字段,则抛出NoSuchFieldException异常。如果访问被拒绝,则抛出SecurityException异常。
下面是一个使用getfield获取公共字段信息的示例代码:
public class Person {
public String name;
public int age;
}
public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Person p = new Person();
p.name = "Tom";
p.age = 20;
Field ageField = Person.class.getField("age");
System.out.println(ageField.getInt(p)); // 输出20
}
}
getdeclaredfield
相较于getfield方法,getdeclaredfield方法在访问对象的非公共字段(non-public field)时更加灵活。getdeclaredfield方法是Class类中的一个方法,其语法如下:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
参数name指定了要获取的字段名称,该方法返回与指定名称匹配的Field对象。如果未找到该字段,则抛出NoSuchFieldException异常。如果访问被拒绝,则抛出SecurityException异常。
下面是一个使用getdeclaredfield方法访问非公共字段(private field)的示例代码:
public class Person {
private String name;
private int age;
}
public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Person p = new Person();
p.name = "Tom";
p.age = 20;
Field nameField = Person.class.getDeclaredField("name");
Field ageField = Person.class.getDeclaredField("age");
nameField.setAccessible(true);
ageField.setAccessible(true);
System.out.println(nameField.get(p)); // 输出Tom
System.out.println(ageField.get(p)); // 输出20
}
}
在这个示例程序中,我们调用了getdeclaredfield方法来获取Person类的name和age字段。由于这两个字段的访问权限为private,所以必须先调用setAccessible(true)方法来打破字段的访问限制。最后我们可以调用get方法来获取这两个字段的值。
总结
getfield和getdeclaredfield方法都是获取字段对象的方法,其中getfield用于获取公共字段,而getdeclaredfield可以获取所有字段(包括公共和非公共字段)。在使用getdeclaredfield方法时,需要先使用setAccessible方法打破字段的访问限制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:getfield和getdeclaredfield的区别 - Python技术站