InetAddress.getAddress() всегда возвращает значение null, но каким-то образом все еще работает

#java #network-programming #inetaddress

#java #сетевое программирование #inetaddress

Вопрос:

У меня есть строковый IP-адрес, который мне нужно преобразовать в массив байтов. Для этого я использовал InetAddress.getByName(ip).getAddress() , и все это отлично работает.

Однако, когда я посмотрел на код InetAddress.getAddress() , он выглядит следующим образом:

 public byte[] getAddress() {
    return null;
}
  

Здесь не выполняется абсолютно никакой операции — однако я все еще получаю обратно массив байтов, с соответствующими значениями тоже. Как это работает?

Ответ №1:

Метод, который вы используете для получения адреса, InetAddress.getByName возвращает подкласс: либо an Inet4Address , либо an Inet6Address . В этих 2 подклассах реализован getAddress метод для возврата чего-то полезного.

Ответ №2:

Я добавлю это к дальнейшему ответу @assylias.

Если вы просмотрите исходный код InetAddress.getByName , вы заметите, что все, что он действительно делает, это вызывает down into 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 метод.