如何在Java反射中获取字段值
我在一个类中有以下字段:如何在Java反射中获取字段值,java,reflection,java-8,Java,Reflection,Java 8,我在一个类中有以下字段: private String str = "xyz"; 如何仅使用字段名获取值xyz,即 我知道字段的名称是str,然后得到指定的值。比如: this.getClass().getDeclaredField("str").getValue(); 当前反射API具有字段。获取(对象)您可以使用: String value = (String) this.getClass().getDeclaredField("str").get(this); 或者以更普遍、更安全的
private String str = "xyz";
如何仅使用字段名获取值xyz
,即
我知道字段的名称是str
,然后得到指定的值。比如:
this.getClass().getDeclaredField("str").getValue();
当前反射API具有字段。获取(对象)
您可以使用:
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.Object
因此,为了代码的安全(以及避免代码增长时出现严重错误),您应该使用试图从中提取字段的对象的实际类:
Field field = YourObject.class.getDeclaredField(fieldName);
假设您在变量
foo
中有一个对象
然后您需要获得字段
Field field = foo.getClass().getDeclaredField("str");
然后通过以下方式允许访问专用字段:
field.setAccessible(true);
您可以通过以下方式实现价值:
Object value = field.get(foo);
如果你这样做只是为了好玩,那就继续吧,但是使用反射通常意味着(除非你在图书馆工作)一些XY问题——答案已经发布了……:|@Eugene它已被编辑。您不应将
getClass()
与getDeclaredField
一起使用,因为当存在子类时,这将中断。使用实际类的nameofActualClass.class
形式的类文字。@Holger你说得对,我已经编辑了我的文章并做了一些解释。
Object value = field.get(foo);