Java反射如何获取字段值

Sai*_*pta 3 java reflection java-8

我在课堂上有以下字段:

private String str = "xyz";
Run Code Online (Sandbox Code Playgroud)

如何仅xyz使用字段名称获取值,即

我知道字段的名称是str,然后获取分配的值。就像是:

this.getClass().getDeclaredField("str").getValue();
Run Code Online (Sandbox Code Playgroud)

目前,Reflection API 有field.get(object).

Lin*_*ica 12

您可以使用:

String value = (String) this.getClass().getDeclaredField("str").get(this);
Run Code Online (Sandbox Code Playgroud)

或者以更通用和更安全的形式:

Field field = anObject.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
String value = (String) field.get(anObject);
Run Code Online (Sandbox Code Playgroud)

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

String value = this.str; 
Run Code Online (Sandbox Code Playgroud)

但你可能知道那个。

注意: anObject.getClass().getDeclaredField()可能不安全,因为anObject.getClass()将返回 的实际类anObject。看这个例子:

Object anObject = "Some string";
Class<?> clazz = anObject.getClass();
System.out.println(clazz);
Run Code Online (Sandbox Code Playgroud)

将打印:

class java.lang.String
Run Code Online (Sandbox Code Playgroud)

并不是:

class java.lang.Object
Run Code Online (Sandbox Code Playgroud)

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

Field field = YourObject.class.getDeclaredField(fieldName);
Run Code Online (Sandbox Code Playgroud)

  • 您不应该将 `getClass()` 与 `getDeclaredField` 一起使用,因为当存在子类时这会中断。使用“NameOfTheActualClass.class”形式的类文字。 (2认同)