我的代码有一个非常奇怪的问题。当我运行它时,会出现异常:
线程“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
,我也会在同一行上获得相同的异常。我想,这取决于类中使用的类型,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-b1504。40 amd64,在Intellij IDEA 2021.2.3中运行它。
根据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的使用,但我不知道如何修复它。