Кто-либо знает, что компонент Java проверяет, ли IP-адрес от конкретной сети/сетевой маски? [закрытый]

Из JLS Java SE 7 Edition §15.11.1:

Отсутствие динамического поиска для доступа к полям позволяет программам эффективно запускаться с помощью простых реализаций. Возможность позднего связывания и переопределения доступна, но только при использовании методов экземпляра.

blockquote>

Ответы Оливера Чарльворта и Марко Топольника верны, я хотел бы подробнее рассказать о почему часть вопроса:

В Java члены класса являются доступными в соответствии с типом ссылки, а не типом фактического объекта. По той же причине, если у вас есть someOtherMethodInB() в классе B, вы не сможете получить к нему доступ из aRef после запуска aRef = b. Идентификаторы (т. Е. Имена классов, переменных и т. Д.) Разрешаются во время компиляции, и поэтому компилятор полагается на ссылочный тип для этого.

Теперь в вашем примере при запуске System.out.println(aRef.intVal); он печатает значение intVal, определенный в A, потому что это тип ссылки, которую вы используете для доступа к ней. Компилятор видит, что aRef имеет тип A, и это intVal, к которому он будет обращаться. Не забывайте, что у вас есть оба поля в экземплярах B. JLS также имеет пример, похожий на ваш, «15.11.1-1. Статическая привязка для доступа к полям», если вы хотите взглянуть.

Но почему методы ведут себя по-другому? Ответ заключается в том, что для методов Java использует позднюю привязку. Это означает, что во время компиляции он находит наиболее подходящий метод для поиска во время выполнения. Поиск включает случай переопределения метода в некотором классе.

22
задан miceuz 23 February 2009 в 11:42
поделиться

2 ответа

Apache Сеть палаты общин имеет org.apache.commons.net.util.SubnetUtils, который, кажется, удовлетворяет Ваши потребности. Похоже, что Вы делаете что-то вроде этого:

SubnetInfo subnet = (new SubnetUtils("10.10.10.0", "255.255.255.128")).getInfo();
boolean test = subnet.isInRange("10.10.10.10");

Примечание, как carson указывает, тот Apache, который Сеть палаты общин имеет ошибка , который препятствует тому, чтобы он дал корректный ответ в некоторых случаях. Carson предлагает использовать версию SVN для предотвращения этой ошибки.

28
ответ дан Omid 28 November 2019 в 22:35
поделиться

Можно также попробовать

boolean inSubnet = (ip & netmask) == (subnet & netmask);

или короче

boolean inSubnet = (ip ^ subnet) & netmask == 0;
11
ответ дан Peter Lawrey 28 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: