2016-11-06 37 views
0

我写一个程序来检查一个给定的IP地址是否是任何本地地址或不作为:InetAddress对象在调用isAnyLocalAddress()时如何返回true?

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?

+3

它在子类中被覆盖。 – tkausl

+0

@tkausl但对象是InetAddress类型,而不是Inet4Address .. –

+1

Are you sure? https://ideone.com/sinGV7 – tkausl

回答

0

如果你看一下这个方法是如何在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); 
    } 
} 

你会看到,返回的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); 
} 

无论是空操作,如默认实现。

相关问题