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...)
上面的元素似乎是枚举,因此需要以不同的方式处理。
我想通了。我遍历对象矩阵的方式是清空一个包含对象的列表,然后尝试遍历各个对象值。有足够的剩余内存占用空间,看起来几乎可以正常工作。我知道这个问题,找出解决方案可能会很有趣...
我有一个深度递归的反射方法,其目的是清除负载中不应返回给调用者的任何值。这套代码
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...)
上面的元素似乎是枚举,因此需要以不同的方式处理。
我想通了。我遍历对象矩阵的方式是清空一个包含对象的列表,然后尝试遍历各个对象值。有足够的剩余内存占用空间,看起来几乎可以正常工作。我知道这个问题,找出解决方案可能会很有趣...