#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
метод.