将指定对象变量上此 field
对象表示的字段设置为指定的新值。如果底层字段的类型为基本类型,则对新值进行自动解包。
进行此操作的方式如下:
如果底层字段是静态字段,则忽略 obj
变量;它可能为 null。
否则底层字段是一个实例字段。如果指定对象变量为 null,则该方法将抛出一个 nullpointerexception
。如果指定对象变量不是声明底层字段的类或接口的实例,则该方法将抛出一个 illegalargumentexception
。
如果此 field
对象实施 java 语言访问控制,并且底层字段是不可访问的,则该方法将抛出一个 illegalaccessexception
。
如果底层字段为 final 字段,则该方法将抛出一个 illegalaccessexception
,除非 setaccessible(true)
已经继承该字段并且该字段是一个非静态字段。在通过程序的其他部分可以访问类的实例之前,只有使用空白 final 字段反序列化或重构类的实例期间,以这种方式设置 final 字段才有意义。在其他任何上下文中使用该方法都可能会有不可预知的结果,包括程序的其他部分继续使用该字段的原始值的情况。
如果底层字段的类型为某一基本类型,则可以尝试使用解包转换将新值转换为基本类型的值。如果该尝试失败,则此方法将抛出一个 illegalargumentexception
。
如果在进行可能的解包之后,无法通过某一标识或扩展转换将新值转换为底层字段的类型,则此方法将抛出一个 illegalargumentexception
。
如果底层字段是静态的,并且声明该字段的类尚未初始化,则初始化这个类。
字段被设置为可能已解包并扩大的新值。
如果字段隐藏在 obj
的类型中,则根据前面的规则设置字段的值。
- 参数:
obj
- 应该修改其字段的对象value
- 正被修改的 obj
的字段的新值
- 抛出:
illegalaccessexception
- 如果底层字段是不可访问的。
illegalargumentexception
- 如果指定对象不是声明底层字段(或者其子类或实现者)的类或接口的实例,或者解包转换失败。
nullpointerexception
- 如果指定对象为 null 并且字段是一个实例字段。
exceptionininitializererror
- 如果此方法引起的初始化失败。