gpt4 book ai didi

java - 为什么 Java 在通过反射调用不装箱的方法时不支持访问原始返回值?

转载 作者:行者123 更新时间:2023-12-02 16:21:00 26 4
gpt4 key购买 nike

我注意到 Java 反射支持在不装箱的情况下访问 boolean 或 int 等原始类型的字段:

public final class Field extends AccessibleObject implements Member {
//...
public boolean getBoolean(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public char getChar(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public byte getByte(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public short getShort(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public int getInt(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public long getLong(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public float getFloat(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
public double getDouble(Object obj) throws IllegalArgumentException, IllegalAccessException { ... }
//...
}

但是,对于始终返回 Object 的方法,只有 invoke(...)。当它与具有原始返回值的方法一起使用时,这会强制装箱。我想知道为什么还没有对此的支持。是否没有被要求或是否有严重的问题阻止它?

最佳答案

are there serious issues which prevent it?

是的,返回值不是 invoke() 中唯一将原语装箱的部分,方法参数也被装箱。

例如如果你有方法 boolean foo(String a, int b, double c),那么你可以这样调用它:

String a = ...;
int b = ...;
double c = ...;

boolean result = method.invoke(obj, a, b, c);

在没有自动装箱和可变参数之前,它会是这样的,这是编译器实际生成的:

boolean result = method.invoke(obj,
new Object[] { a,
Integer.valueOf(b)/*auto-boxing*/,
Double.valueOf(c)/*auto-boxing*/ })
.booleanValue()/*auto-unboxing*/;

为了消除原语装箱的需要,API 需要提供一个重载的 invoke() 方法,它与方法的签名完全匹配,而不仅仅是与返回类型匹配的方法。

必须有大量的重载,这将是一个严重的问题。

对各种返回类型进行重载而不对参数进行重载是没有意义的,因为你想用它来解决什么问题?什么都没有。

进行自反方法调用的开销足够高,因此对返回值进行装箱不是问题。

关于java - 为什么 Java 在通过反射调用不装箱的方法时不支持访问原始返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65515313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com