Field::setLong与类中的Long和Long字段的行为不同



我的代码有一个非常奇怪的问题。当我运行它时,我得到异常:

线程中的异常"主";java.lang.IllegalArgumentException:无法将java.lang.Long字段lesson12.TestReflectionRepository.Main$TestSetLong.LongField设置为(Long(23132位于java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessor Impl.java:167(位于java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessor Impl.java:195(位于java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.setLong(UnsafeObjectFieldAccess orImpl.java:120(位于java.base/java.lang.reflect.Field.setLong(Field.java:1021(至少12.TestReflectionRepository.Main.Main(Main.java:15(

我不明白它的意思。如果我对变量l使用类型Long,我也会在同一行上得到相同的异常。我认为,这取决于类中使用的类型,long还是Long。但我认为,它不应该这样工作。为什么会发生这种情况?我怎么了?

public class Main {
public static class TestSetLong {
public Long LongField;
public long longField;
}
public static void main(String[] args) throws Exception {
TestSetLong obj = new TestSetLong();
Class cobj = obj.getClass();
Field longField = cobj.getField("longField"), LongField = cobj.getField("LongField");
long l = 23132L;//if I use Long I also get this exception on the same line
longField.setLong(obj, l);
LongField.setLong(obj, l);
}
}

我使用OpenJDK 11.0.12+7-b150.40 amd64,在Intellij IDEA 2021.2.3中运行。

根据Field的JavaDoc,您可以:

  • 使用Field.set(Object, Object)设置引用字段和基元字段

如果基础字段是基元类型,则会尝试展开转换,以将新值转换为基元类型的值。如果此尝试失败,该方法将抛出一个IllegalArgumentException。

  • 仅使用Field.setLong(Object, long)设置(基元(类型为long的字段

将字段的值设置为指定对象上的long。此方法等效于set(obj,lObj(,其中lObj是Long对象,lObj.longValue((==l。

请注意,此描述提到了set(Object, Object)中发生的自动展开,但它没有暗示可能允许自动展开。

相关内容

  • 没有找到相关文章

最新更新