2016-12-27 3 views
1

Вопрос о том, как найти имя хоста текущего компьютера, является одним из наиболее частых вопросов Java здесь и на других форумах программирования, а общий ответ - InetAddress.getLocalHost().getHostName() не так уж хорош (as explained here).Почему Java скрывает реализацию getLocalHostName()?

Но, видимо, Java уже делает правильную вещь - как документально для getLocalHost() указанным выше способом:

Возвращает адрес локального хоста. Это достигается путем извлечения имени хоста из системы, а затем разрешения этого имени в InetAddress.

Так что, если код примера выше будет использоваться, то, что мы, по существу, это:

  1. получить имя хоста из системы
  2. разрешить имя в интернет-адрес
  3. разрешить имя на имя хоста (вероятно, с использованием локального /etc/hosts файла)

Что выглядит как немного избыточно и вероятность ошибки (шаг 2, скорее всего, не удастся, если вы не на хорошо сконфигурированном сервере, а шаг 3 также может завершиться неудачей), если все, что вам нужно, - это шаг 1.

Что делать getLocalHost() делает внутри, чтобы позвонить getLocalHostName() на реализация java.net.InetAddressImpl заключается в том, что он статично ставит на IPv4 или реализацию IPv6 в зависимости от некоторых параметров системы (даже не заботятся о поддержке платформы - я предполагаю, что все кодирование на платформе обрабатывается в исходной реализации для InetAddressImpl).

Так почему же мы не можем использовать это прямо? Ну, мы «не можем», потому что все точки входа, чтобы добраться до getLocalHostName() являются «частным пакет», который на самом деле нет никакой защиты - просто уронить эту реализацию где-то в вашем классе пути и получить прямой доступ:

package java.net; 
public class HostNameHelper { 
    public static String getLocalHostName() throws UnknownHostException { 
     return java.net.InetAddress.impl.getLocalHostName(); 
    } 
} 

Так зачем вообще беспокоиться? Почему Sun/Oracle не давали разработчикам Java то, от чего они так отчаянно нуждаются?

+0

Я уверен, что обходной путь не будет работать в программах, использующих модульную систему Java 9. – VGR

+0

Ну, это на самом деле не работает в более ранних версиях Java (по крайней мере, уже 7) - 'java.net' является« защищенным пакетом », а смертным не разрешается добавлять к нему классы. Я в основном использовал его в качестве предлога для начала обсуждения, но похоже, что нет ящиков ... – Guss

+0

«В основном я использовал его в качестве предлога, чтобы начать обсуждение ...» «[так] явно _not_ a дискуссионный форум. Для этого есть [чат]. –

ответ

0

Он терпит неудачу в Java 8 с: Вызванный: java.lang.SecurityException: Запрещенные имя пакета: java.net

Он терпит неудачу в Java 9 с: Вызванный: java.lang.ClassNotFoundException: Java .net.HostNameHelper

 Смежные вопросы

  • Нет связанных вопросов^_^