具体来说,我想知道反序列化对象时反序列化器如何设置私有字段?考虑这样的示例类:
public class MyClass {
@JsonProperty( "My String" );
private String myString;
}
如果使用objectMapper.readValue(json, MyClass.class);
将其反序列化,如果将生成的对象标记为private
,如何设置该字段?
答案 0 :(得分:1)
在通过反射读取或写入值之前调用Field.setAccessible(true)可以解决问题。
有关详细信息,请参见相应的javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-
但是要小心使用;-)
答案 1 :(得分:1)
相当多的框架允许使用Field.setAccessible(true)
以这种方式访问私有字段。它允许应用程序忽略Java语言可见性规则(即私有),并通过反射API Field
类的实例读取或更改值。
在此问题中可以找到更多信息: Java reflection - impact of setAccessible(true)
答案 2 :(得分:0)
简短的回答是它通常无法正常运行。我们使用lombok生成变量的getter / setter,但是您当然可以编写自己的变量。 Jackson具有与您的主代码相同的可见性,因此,如果没有一些公共获取器/设置器或像这样配置对象映射器,就无法映射私有字段... objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
。
这两个都无法正常序列化。您可以在课程级别使用Lombok @Getter
和@Setter
,以便Jackson可以与myString
一起使用,或者将@JsonAutoDetect(fieldVisibility = Visibility.ANY)
放在下面的课程级别。
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class MyClass {
@JsonProperty( "My String" );
private String myString;
}