InetAddress.getAddress()始终返回null,但是仍然可以使用

时间:2019-03-15 15:41:32

标签: java network-programming inetaddress

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

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

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

这里绝对没有执行任何操作-但是,我仍然返回一个字节数组,也包含了corerect值。如何运作?

2 个答案:

答案 0 :(得分:2)

用于获取地址的方法InetAddress.getByName返回一个子类:Inet4AddressInet6Address。这两个子类都实现了getAddress方法,以返回有用的内容。

答案 1 :(得分:1)

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

如果您浏览InetAddress.getByName的源代码,您会发现它真正所做的只是调用InetAddress.getAllByName。如果您查看那个方法的源代码,您将在结尾处看到以下内容:

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方法。