如何在Java反射中获取字段值

时间:2019-03-22 08:03:35

标签: java reflection java-8

我在课堂上有以下字段:

private String str = "xyz";

如何仅使用字段名称​​ (即

)获得值xyz

我知道该字段的名称为str,然后获取分配的值。像这样:

this.getClass().getDeclaredField("str").getValue();

当前Reflection API具有field.get(object)

2 个答案:

答案 0 :(得分:2)

您可以使用:

String value = (String) this.getClass().getDeclaredField("str").get(this);

或更通用或更安全的形式:

Field field = anObject.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
String value = (String) field.get(anObject);

对于您的示例,这应该足够了:

String value = this.str; 

但是您可能知道那个。

注意anObject.getClass().getDeclaredField()可能是不安全的,因为anObject.getClass()将返回anObject的实际类。参见以下示例:

Object anObject = "Some string";
Class<?> clazz = anObject.getClass();
System.out.println(clazz);

将打印:

class java.lang.String

不是:

class java.lang.Object

因此,为了确保代码安全(并避免代码增长时出现讨厌的错误),您应该使用要从中提取字段的对象的实际类:

Field field = YourObject.class.getDeclaredField(fieldName);

答案 1 :(得分:0)

假设您在变量foo中有对象。

然后您需要获取Field

Field field = foo.getClass().getDeclaredField("str");

然后允许通过以下方式访问私有字段:

field.setAccessible(true);

您可以通过以下方式获得价值

Object value = field.get(foo);