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