当前位置: 首页 > 知识库问答 >
问题:

Field::setLong在类中使用Long和Long字段时表现不同

孟茂
2023-03-14

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

线程“main”java中出现异常。lang.IllegalArgumentException:无法设置java。朗·朗菲尔德第12课。TestReflectionRepository。Main$TestSetLong。朗菲尔德至爪哇岛23132号(朗)。base/jdk。内部的反映不安全的附件。通过java上的SetillegalArgumentException(UnsafeFieldAccessorImpl.java:167)。base/jdk。内部的反映不安全的附件。通过java上的SetillegalArgumentException(UnsafeFieldAccessorImpl.java:195)。base/jdk。内部的反映UnsafeObjectFieldAccessorImpl。java上的setLong(UnsafeObjectFieldAccessorImpl.java:120)。base/java。朗,反思一下。领域setLong(Field.java:1021)在第12课。TestReflectionRepository。主要的main(main.java:15)

我不明白这是什么意思。如果我为变量l使用typeLong,我也会在同一行上获得相同的异常。我想,这取决于类中使用的类型,longLong。但是我想,它不应该这样工作。为什么会这样?我做错了什么?

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-b1504。40 amd64,在Intellij IDEA 2021.2.3中运行它。

共有1个答案

华良才
2023-03-14

根据JavaDoc forField,您可以:

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

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

  • 使用字段。setLong(Object,long)仅用于设置(原语)类型的字段long

将字段的值设置为指定对象上的long。这种方法相当于set(obj,lObj),其中lObj是长对象,lObj是长对象。longValue()==l。

请注意,本说明提到了在集合(对象,对象)中发生的自动展开,但它没有给出允许自动包装的提示。

 类似资料:
  • 描述 (Description) java.lang.reflect.Field.setLong(Object obj, long value)方法将字段的值设置为指定对象上的long。 声明 (Declaration) 以下是java.lang.reflect.Field.setLong(Object obj, long value)方法的声明。 public void setLong(Obje

  • 问题内容: 以下是我的界面- 这是我对接口的实现- 现在我有一个工厂,它得到这样的实例- 现在,我需要调用接受参数的my方法,下面是相同的类。本课不是我写的,所以这是我对此有疑问的原因,我非常确定这是错误的做法。 因此,当客户调用的方法时,他们将像这样创建参数,然后使用工厂获取的实例,然后相应地调用read方法。 问题陈述:- 所以我的第一个问题是确实的,,应该是对象或者只是在上课吗? 第二个问题

  • 描述 (Description) java.lang.reflect.Array.setLong(Object array, int index, long value)方法将指定数组对象的索引组件的值设置为指定的long值。 声明 (Declaration) 以下是java.lang.reflect.Array.setLong(Object array, int index, long valu

  • 我正在从Java过渡到C,对<code>long</code>数据类型有一些疑问。在Java中,要保存大于2的整数<sup>32<sup>,只需编写<code>长x 。然而,在C语言中,<code>long</code>似乎既是数据类型又是修饰符。 似乎有几种方法可以使用: 还有,好像还有这样的事情: 等等 所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?

  • 这是一个至少为64 bit的整数类型(译注:实际宽度依赖于具体的实现平台),例如: long long x = 9223372036854775807LL; 不过,不要想当然地认为存在long long long或者将long拼写为short long long。 (译注:如同J. Stephen Adamczyk在参考文献中所言,”long long”是一个晦涩的拼写64-bit整数类型的方式

  • 我很难确定何时使用int、double和long。 我正在计算整数的幂,只要提供的幂不是负数,就返回结果。 对于作业,我需要使用以下代码开始: 以下是我的想法: 我知道我弄乱了int、double或long的使用,但我不知道如何修复它。