現在のマシンのホスト名を見つける方法を質問することは、頻繁に行われるJavaの質問の1つであり、他のプログラミングフォーラムやよくある答え - InetAddress.getLocalHost().getHostName()
はあまり良くありません(as explained here)。JavaがgetLocalHostName()の実装を隠すのはなぜですか?
しかし、どうやらJavaがすでに正しいことを行う - 上記getLocalHost()
方法のために文書化されているよう:
は、ローカルホストのアドレスを返します。これは、システムからホストの名前を取得し、その名前をInetAddressに解決することによって実現されます。私たちは、基本的に何をすべきか上記のコード例を使用するので、場合
は、次のとおりです。
- は、インターネットアドレスに名前を解決するシステム
- からホスト名を取得
- ビットの両方の冗長思われる
(おそらくローカル/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.SecurityException:によって引き起こさ :それはしてJava 8で失敗し
私は、Java 9のモジュールシステムを使用するプログラムでは回避策が動作しないと確信しています。 – VGR
さて、それは実際には以前のバージョンのJavaでは(少なくとも7までは)動作しません。 'java.net'は「保護されたパッケージ」であり、死人はクラスを追加できません。私はほとんど議論を始める言い訳としてそれを使用していましたが、それは奪取者がいないように見えます... – Guss
"私は主に議論を始める言い訳としてそれを使用していました..." [so]明示的に_not_ aディスカッションフォーラム。それは[チャット]です。 –