我有一个字符串IP地址,我需要将其转换为字节数组。为此,我使用了InetAddress.getByName(ip).getAddress()
,一切都很好。
但是,当我查看InetAddress.getAddress()
的代码时,看起来像这样:
public byte[] getAddress() {
return null;
}
这里绝对没有执行任何操作-但是,我仍然返回一个字节数组,也包含了corerect值。如何运作?
答案 0 :(得分:2)
用于获取地址的方法InetAddress.getByName
返回一个子类:Inet4Address
或Inet6Address
。这两个子类都实现了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
对象。
因此,由于您获得Inet4Address
或Inet6Address
,并且它们都具有getAddress
的完整实现,因此您从不真正调用InetAddress.getAddress
方法。