2016-12-27 5 views
1

현재 컴퓨터의 호스트 이름을 찾는 방법을 묻는 것은 자주 Java 질문 중 하나이며 다른 프로그래밍 포럼에서 일반적인 답변 인 InetAddress.getLocalHost().getHostName()은 그리 좋지 않습니다 (as explained here).Java가 getLocalHostName() 구현을 숨기는 이유는 무엇입니까?

그러나 분명히 자바는 이미 올바른 일을 - 위에서 언급 한 getLocalHost() 방법에 대해 설명되어 같이

은 로컬 호스트의 주소를 돌려줍니다. 이것은, 시스템으로부터 호스트의 이름을 취득 해, 그 이름을 InetAddress에 해결하는 것에 의해 실현됩니다. 우리가 본질적으로 무엇을 위의 코드 예제를 사용하는 것입니다 그래서 경우

은 다음과 같습니다

  1. 는 인터넷 주소로 이름을 확인 시스템
  2. 에서 호스트의 이름을 검색
  3. 것 모두 약간의 중복 어떤

(가능성이 로컬 /etc/hosts 파일을 사용하여) 다시 호스트 이름으로 이름을 확인 오류가 발생하기 쉽습니다 (잘 구성된 서버를 사용하지 않으면 2 단계가 실패하고 3 단계도 실패 할 수 있습니다).

내부적으로는 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 개발자에게 절실히 필요로하는 것을 제공하지 않았습니까? 에 의한 : java.lang.ClassNotFoundException가 :이 java.lang.SecurityException : 금지 패키지 이름 : 그것은 자바 9에 실패

java.net에 의한 :

+0

Java 9의 모듈 시스템을 사용하는 프로그램에서 해결 방법이 작동하지 않을 것이라고 확신합니다. – VGR

+0

글쎄, 실제로는 이전 버전의 자바에서는 작동하지 않습니다. (적어도 7 일 전부터) - java.net은 "보호 된 패키지"이며 필사자는 클래스를 추가 할 수 없습니다. 나는 대부분 토론을 시작하기 위해 그것을 변명으로 사용하고 있었지만 아무도받지 못하는 것처럼 보였다. ... – Guss

+0

"나는 토론을 시작하기 위해 그것을 주로 핑계로 사용했다 ... _"[so]는 명시 적으로 _not_ a가 아닙니다. 토론 포럼. 거기에 [채팅]이 있습니다. –

답변

0

그것은 자바 8 실패 자바 .net.HostNameHelper