我的代码有一个非常奇怪的问题。当我运行它时,我得到异常:
线程中的异常"主";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)
中发生的自动展开,但它没有暗示可能允许自动展开。