InetAddress.getAddress() 始终 returns 为 null,但不知何故仍然有效

InetAddress.getAddress() always returns a null, but somehow still works

我有一个字符串 IP 地址需要转换为字节数组。为此,我使用了 InetAddress.getByName(ip).getAddress(),一切都很好。

然而,当我查看InetAddress.getAddress()的代码时,它看起来像这样:

public byte[] getAddress() {
    return null;
}

这里绝对没有执行任何操作 - 但是,我仍然得到一个字节数组,也有正确的值。这是如何工作的?

您用来获取地址的方法,InetAddress.getByName return 是一个子类:Inet4AddressInet6Address。这 2 个子类实现了 getAddress 方法以 return 一些有用的东西。

我会将其添加到@assylias 的进一步回答中。

如果您查看 InetAddress.getByName 的源代码,您会发现它真正做的就是向下调用 InetAddress.getAllByName。如果您查看 that 方法的源代码,您将在最后看到以下内容:

InetAddress[] ret = new InetAddress[1];

if(addr != null) {
    if (addr.length == Inet4Address.INADDRSZ) {
        ret[0] = new Inet4Address(null, addr);
    } else {
        if (ifname != null) {
            ret[0] = new Inet6Address(null, addr, ifname);
        } else {
            ret[0] = new Inet6Address(null, addr, numericZone);
        }
    }
    return ret;
}

在那里你可以看到 InetAddress.getAllByName 试图确定地址格式的 IP 版本。然后它根据输入字符串的格式实例化一个 Inet4/6Address 对象。

因此,因为您得到的是 Inet4AddressInet6Address,并且它们都具有 getAddress 的完整实现,所以您永远不会真正调用 InetAddress.getAddress 方法。