我编写了一个程序来检查给定的IP地址是否为任何本地地址:
import java.net.*;
class GetByName
{
public static void main(String[] args) throws Exception
{
byte[] b = {0, 0, 0, 0};
String s = "abc";
InetAddress in = InetAddress.getByAddress(b);
boolean b1 = in.isAnyLocalAddress();
System.out.println(in);
System.out.println(b1);
}
}
输出是:
/0.0.0.0
true
是的,看起来很正常。但是当我在InetAddress.java中看到isAnyLocalAddress()的实现时,我感到震惊。
public boolean isAnyLocalAddress() {
return false;
}
无论如何,此方法必须返回false。那么这个方法在我的程序中如何返回true?
答案 0 :(得分:1)
如果你看看AOSP source code:
中如何实现这种方法private static InetAddress getByAddress(String hostName, byte[] ipAddress, int scopeId) throws UnknownHostException {
if (ipAddress == null) {
throw new UnknownHostException("ipAddress == null");
}
if (ipAddress.length == 4) {
return new Inet4Address(ipAddress.clone(), hostName);
} else if (ipAddress.length == 16) {
// First check to see if the address is an IPv6-mapped
// IPv4 address. If it is, then we can make it a IPv4
// address, otherwise, we'll create an IPv6 address.
if (isIPv4MappedAddress(ipAddress)) {
return new Inet4Address(ipv4MappedToIPv4(ipAddress), hostName);
} else {
return new Inet6Address(ipAddress.clone(), hostName, scopeId);
}
} else {
throw badAddressLength(ipAddress);
}
}
您会看到返回Inet4Address
或Inet6Address
之一。展望未来,Inet4Address
实现为:
@Override public boolean isAnyLocalAddress() {
return ipaddress[0] == 0 && ipaddress[1] == 0 && ipaddress[2] == 0 && ipaddress[3] == 0; // 0.0.0.0
}
和Inet6Address
是:
@Override public boolean isAnyLocalAddress() {
return Arrays.equals(ipaddress, Inet6Address.ANY.ipaddress);
}
没有像默认实现那样的无操作。