InetAddress对象如何在调用isAnyLocalAddress()时返回true



我写了一个程序来检查一个给定的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 ?

如果你看一下这个方法是如何在AOSP源代码中实现的:

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);
    }
}

您将看到返回Inet4AddressInet6Address中的一个。进一步看,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);
}

也不是默认实现的无操作

最新更新