Java 将字段反射分配为 null 导致 IllegaArgumentException

Java reflective assignment of field to null resulting in an IllegaArgumentException

我有一个深度递归的反射方法,其目的是清除负载中不应返回给调用者的任何值。这套代码

if (function.apply(attribute)) {
      field.setAccessible(true);
      if (!field.getType().isPrimitive()) {
        log.info("field to be set to null = " + field.getType().getName());
        field.set(object, null);
      }

被重复调用。当它到达特定字段时,我收到错误

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field edu.psu.swe.aed.extensions.data.Citizenship.citizenshipCountry to edu.psu.swe.aed.extensions.PersonBioExtension

日志语句的一些输出显示它正在工作到那个点看起来像这样

16:26:35,906 INFO  [edu.psu.swe.scim.server.utility.AttributeUtil] (default task-35) field to be set to null = java.lang.String
16:26:35,906 INFO  [edu.psu.swe.scim.server.utility.AttributeUtil] (default task-35) field to be set to null = edu.psu.iam.services.soap.endpoint.DocumentType
16:26:35,906 INFO  [edu.psu.swe.scim.server.utility.AttributeUtil] (default task-35) field to be set to null = java.util.List
16:26:35,906 INFO  [edu.psu.swe.scim.server.utility.AttributeUtil] (default task-35) field to be set to null = java.util.List
16:26:35,906 INFO  [edu.psu.swe.scim.server.utility.AttributeUtil] (default task-35) field to be set to null = java.lang.String

我只能猜测我以某种方式破坏了调用堆栈或内存模型,但我不知道如何解决这个问题。我已经完全擦除目标目录中的所有内容以确保我没有粘性 class 文件,但没有运气。

有人对为什么会发生这种情况有任何建议,或者对如何继续进行故障排除有任何建议吗?

提前致谢。

很明显,为什么要将空值设置为非字符串基元。

要解决此问题,请尝试: 1. 在日志中显示元素类型及其当前值 2.检查报错的元素类型 3. 一旦测试有条件地将默认值设置为元素 (0,null etc...)

上面的元素似乎是枚举,因此需要以不同的方式处理。

我想通了。我遍历对象矩阵的方式是清空一个包含对象的列表,然后尝试遍历各个对象值。有足够的剩余内存占用空间,看起来几乎可以正常工作。我知道这个问题,找出解决方案可能会很有趣...