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

Jok*_*ker 19 java autoboxing

据我所知,下面的代码应该打印"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据JLS§5.1.7.拳击转换:

如果该值p被装箱是true,false,一个byte,或一个char在所述范围内\u0000\u007fintshort之间号-128127(含),然后让和是任何两个装箱转换的结果.情况总是如此.r1r2pr1 == r2

但是,如果通过反射调用方法,则始终通过框创建值new PrimitiveWrapper().

请帮我理解这个.

Old*_*eon 13

invoke始终返回一个新的Object.任何返回的基元都是盒装的.

...如果[return]值具有基本类型,则首先将其适当地包装在对象中.

您的问题正在适当地证明该术语的模糊性.包装过程中即它并没有使用通过Boolean.valueOf(布尔).

  • 只是添加一个可能的原因的建议:[反射 API](https://www.javaworld.com/article/2077015/java-se/take-an-in-depth-look-at- the-java-reflection-api.html) 是在 1.1 中添加的;[`Boolean.valueOf`](https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#valueOf-boolean-) 是在 1.4 中添加的。也许为了向后兼容保留了 pre-valueOf 行为。 (2认同)