InetAddress.getAddress () всегда возвращает ноль, но все равно как-то работает - PullRequest
3 голосов
/ 15 марта 2019

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

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

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

Естьздесь абсолютно не выполняется никаких операций - однако я все еще возвращаю байтовый массив со значениями corerect.Как это работает?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

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

1 голос
/ 15 марта 2019

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

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

...