为什么Java隐藏了他们的getLocalHostName()实现?

时间:2016-12-27 19:02:27

标签: java networking ip-address hostname

询问如何找到当前机器的主机名是这里和其他编程论坛中更常见的Java问题之一,常见的答案 - getLocalHost()不是那么好(as explained here)。< / p>

但显然Java已经做了正确的事情 - 正如上面提到的/etc/hosts方法所记录的那样:

  

返回本地主机的地址。这是通过从系统中检索主机名,然后将该名称解析为InetAddress来实现的。

因此,如果要使用上面的代码示例,我们基本上做的是:

  1. 从系统中检索主机名称
  2. 将名称解析为互联网地址
  3. 将名称解析回主机名(可能使用本地getLocalHost()文件)
  4. 这似乎有点冗余且容易出错(如果您不在配置良好的服务器上,步骤2可能会失败,并且步骤3也可能失败),如果您想要的只是步骤1。

    内部getLocalHostName()java.net.InetAddressImpl的实现上调用InetAddressImpl,它根据某些系统参数静态实例化为IPv4或IPv6实现(它甚至不会关心平台支持 - 我假设所有特定于平台的编码都在getLocalHostName())的本地实现中处理。

    那为什么我们不能直接使用它呢?好吧,我们“不能”因为所有进入package java.net; public class HostNameHelper { public static String getLocalHostName() throws UnknownHostException { return java.net.InetAddress.impl.getLocalHostName(); } } 的入口点都是“包私有”,这实际上没有保护 - 只需将此实现放在类路径的某个位置并获得直接访问:

    ls | ruby -e "STDIN.each_line.to_a.map(&:strip).each(&method(:puts))"
    

    那为什么要费心呢?为什么Sun / Oracle没有为Java开发人员提供他们如此渴望的东西?

1 个答案:

答案 0 :(得分:0)

它在java 8中失败: 引起:java.lang.SecurityException:禁止包名:java.net

在java 9中失败了: 引起:java.lang.ClassNotFoundException:java.net.HostNameHelper