首先需要了解反射机制,它是Java中的一种高级特性,允许程序在运行时获取类的信息以及动态调用它的方法,甚至可以在运行时动态修改类的属性和方法。在反射机制中,我们通常使用Java.lang.reflect包中提供的类完成相关功能。其中,getDeclaredField和getField是两个比较常用的方法,主要用于获取类的字段(属性)信息,它们在使用上也有所区别,下面详细讲解它们的不同之处。
- getField方法
getField方法用于获取当前类或其父类声明为public的属性(即公有属性),它可以访问类的共有变量。该方法参数为字段名称,返回Field类型的属性对象,代码示例如下:
public class Demo {
public String name = "test";
}
public class Test {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
Field field = demo.getClass().getField("name");
String name = (String) field.get(demo);
System.out.println("name: " + name);
}
}
这里我们定义了一个Demo类,其中包含了一个公有的String类型的name属性,然后通过getField方法获取这个属性,并打印输出它的值。如上代码即可输出"test"。
- getDeclaredField方法
getDeclaredField方法用于获取当前类声明的所有属性,包括public、protected、default、private的四种属性(访问范围更广)。该方法参数为字段名称,返回Field类型的属性对象,如下示例代码所示:
public class Demo {
public static String name = "test";
private int age = 18;
}
public class Test {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
Field field = demo.getClass().getDeclaredField("age");
field.setAccessible(true);
int age = (int) field.get(demo);
System.out.println("age: " + age);
}
}
在上述代码中,我们定义了一个Demo类,其中包含一个公有的name属性和一个私有的age属性。在main方法中,我们使用getDeclaredField方法获取age属性对象,由于它是私有属性,因此需要设置setAccessible(true),以允许访问私有变量。最后输出"age: 18"。
综上所述,getField方法和getDeclaredField方法都能用来获取一个类的属性,但getDeclaredField方法还能够获取当前类声明的所有属性,包括public、protected、default、private的四种属性。但由于getDeclaredField方法能获取较多的信息,因此访问权限也相对会受到限制,需要使用setAccessible方法来访问类的私有属性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:反射机制:getDeclaredField和getField的区别说明 - Python技术站