java.net.NetworkInterfaceクラスに、ネットワーク・インタフェース・カードのMACアドレスを問い合わせるメソッドが追加されました。
| メソッド名 | 内容 |
|---|---|
| byte[] getHardwareAddress() | ハードウェアアドレス(通常MACアドレス)を返却 |
まずは、マシンのネットワーク・インタフェース(1つとは限らない)に対応するNetworkInterfaceインスタンスを取り出します。
Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
while (nics.hasMoreElements()) {
NetworkInterface ni = nics.nextElement();
System.out.println("Name : " + ni.getName());
System.out.println("Display name : " + ni.getDisplayName());
System.out.println("Hardware address: " + toHexString(ni.getHardwareAddress()));
}
実行結果の例を以下に示します。
Name : lo Display name : MS TCP Loopback interface Hardware address: Name : eth0 Display name : NVIDIA nForce Networking Controller - .... Hardware address: xxxxxxxxxxxx Name : tun0 Display name : Teredo Tunneling Pseudo-Interface Hardware address: ffffffffffffffff Name : tun1 Display name : 6to4 Pseudo-Interface Hardware address: xxxxxxxx Name : tun2 Display name : Automatic Tunneling Pseudo-Interface Hardware address: xxxxxxxx
xxの部分には実際には実行するマシン固有の値が入ります。
通常このように、複数の(論理的な)ネットワークインタフェースが存在します。これでは、MACアドレスをどのNetworkInterfaceインスタンスから取り出せばよいのか判別が難しいという問題があります。
いつくか考えつく対策は以下のとおりです。