询问如何找到当前机器的主机名是这里和其他编程论坛中更常见的Java问题之一,常见的答案 - getLocalHost()
不是那么好(as explained here)。< / p>
但显然Java已经做了正确的事情 - 正如上面提到的/etc/hosts
方法所记录的那样:
返回本地主机的地址。这是通过从系统中检索主机名,然后将该名称解析为InetAddress来实现的。
因此,如果要使用上面的代码示例,我们基本上做的是:
getLocalHost()
文件)这似乎有点冗余且容易出错(如果您不在配置良好的服务器上,步骤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开发人员提供他们如此渴望的东西?
答案 0 :(得分:0)
它在java 8中失败: 引起:java.lang.SecurityException:禁止包名:java.net
在java 9中失败了: 引起:java.lang.ClassNotFoundException:java.net.HostNameHelper