Java Tips:正体不明のオブジェクトのクラスを調べるには?

開発中やデバッグ時に、オブジェクトのクラス名を調べたい場合、通常は自ら作ったオブジェクトクラスではあり得ませんが、コレクションに格納されているオブジェクトではソースコード上では分からなくなります。ちょっとしたコードでクラス名を取得する方法を紹介しましょう。

» 2004年07月26日 15時38分 公開
[JAVA Developer]

正体不明のオブジェクトのクラスを調べるには?

 J2SEのコアパッケージでも頻繁に利用されていますが,コレクションクラスを利用していると,格納されているオブジェクトがわからなくて戸惑うことがあります。コレクションはすべてObjectとして保持するため,ソースコード上ではObjectクラスにしか見えなくなってしまうのです。

 たとえば,クラスjava.net.NetworkInterfaceのJavadocのうち,getNetworkInterfacesメソッド部分を読んでいると,次のように記載されています。

public static Enumeration getNetworkInterfaces()

このマシン上のすべてのインタフェースを返します。このマシンでネットワークインタフェースが見つからなかった場合はnullを返します。

 注意深く読むと,NetworkInterfaceクラスがコレクションに格納されていることが想像できますが,少なくとも格納されているオブジェクトに関して明言されていません。

 コレクションを利用していると,このようなことが頻繁に起きます。Tiger(J2SE 5,あるいは従来J2SE 1.5と呼ばれていたバージョン)でGenericsを用いると,コレクションに格納されているオブジェクトが明確になりますが,従来のライブラリやオープンソースソフトウェアでは,まだ当分は従来のコレクションのままで利用されることが予想できます。

 そこで,ここでは任意のオブジェクトのクラス名を表示するサンプルを紹介しましょう。これはとても簡単に実現できます。覚えておくと何かにつけて便利です。

Objectクラスがすべての鍵を握る

 まず,すべてのオブジェクトはgetClassメソッドを持ちます。これはObjectクラスから継承したメソッドですので,このメソッドを持たないオブジェクトはありません。しかも,final修飾子がついていますので,サブクラスでオーバーライドされることはありません。必ず対象オブジェクトのClassが取得できます。

Object o;
Class cls = o.getClass();

 次にClassクラスはgetNameメソッドを呼び出すことにより,完全修飾クラス名(FQCN)が取得できます。

Class cls;
String name = cls.getName();

 こうすることにより,対象オブジェクトの完全修飾クラス名が取得できることになります。

 まとめると,次のようにgetClassとgetNameの2段階呼び出しで,すべてのオブジェクトのクラス名がわかるようになります。

java.util.Enumeration enu;
while (enu.hasMoreElements()) 
{
    Object o = enu.nextElement();
    System.out.println("クラス名=" + o.getClass().getName());
}

 「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ