当前位置: 首页 > 面试题库 >

为什么通过反射调用时自动装箱不使用valueOf()?

黄浩涆
2023-03-14
问题内容

据我了解,以下代码应该打印"true",但是当我运行它时,它可以打印"false"

public class Test {
    public static boolean testTrue() {
        return true;
    }

    public static void main(String[] args) throws Exception {
        Object trueResult = Test.class.getMethod("testTrue").invoke(null);
        System.out.println(trueResult == Boolean.TRUE);
    }
}

根据JLS§5.1.7。装箱转换:

如果该值p被装箱是truefalse,一个byte,或一个char在所述范围内\u0000\u007fintshort之间号-128127(含),然后让和是任何两个装箱转换的结果。总是这样的。r1``r2``p``r1 == r2

但是,在通过反射调用方法的情况下,始终通过创建框值new PrimitiveWrapper()

请帮助我理解这一点。


问题答案:

调用将
始终 返回一个新的Object。所有返回的原语都装箱。

…如果[return]值具有原始类型,则首先将其适当包装在一个对象中。

您的问题是 恰当地 说明该术语的含糊之处。包装过程中即它并 没有
使用通过Boolean.valueOf(布尔)。



 类似资料:
  • 问题内容: 我想将原语转换为字符串,然后尝试: 失败并显示以下错误: 现在,我知道原语不是引用类型(即不是对象),因此不能有方法。但是,Java 5引入了自动装箱和拆箱功能(一种C#…我在C#中从未喜欢过,但这不重要)。因此,通过自动装箱,我希望上面将myInt转换为Integer,然后在其上调用toString()。 此外,我相信C#允许这样的调用,除非我记错了。这仅仅是Java的自动装箱/拆箱

  • 问题内容: 我有一个Class对象,我想调用一个静态方法。我有以下代码。 打印: 但是随后它抛出: 我在这里俯瞰什么? 问题答案: 您将不得不使用 该方法接受。 (更正)传递的数组按原样使用并且为空,因此它没有要传递给方法调用的元素。通过将其强制转换为对象,这就是包装中的唯一元素。 这是由于数组协方差。你可以做 因为a 是。 另外,您也可以将其包装在 然后,该方法将使用as中的元素作为方法调用的参

  • 问题内容: 自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换结果相反,则称为拆箱。 那么,为什么我们需要它?为什么要在Java中使用自动装箱和拆箱呢? 问题答案: 需要一些上下文来充分理解其背后的主要原因。 基元与类 Java中的原始变量包含值(整数,双精度浮点二进制数等)。由于这些

  • 大家好,我还是java的初学者,有没有人能给我解释一下,自动装箱和取消装箱之间有什么区别,什么时候使用?

  • 如果被装箱的值是和之间的类型的整数文字(§3.10.1),或者是或(§3.10.3),或者是和之间的字符文字(§3.10.4),则让和是任意两次装箱转换的结果。情况总是。 描述行为的 <罢工> 一模一样 与相似*。但似乎并不能保证确实被调用,这意味着理论上可能有一个实现为自动装箱的值保留一个单独的专用缓存。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间的标识可能不相等。 Oracle的“自动