HOWTO · Java
Javaでオブジェクトの実行時クラスを取得する
Javaにtypeof演算子はありません。getClass()でオブジェクトの実行時クラスを取得する方法と、ラッパーオブジェクトでの使い方を解説します。
このページの内容
Javaにはtypeof演算子がありません。オブジェクトの実行時クラスを調べるには、nullではないオブジェクト参照に対してgetClass()を呼び出します。intやcharなどのプリミティブ値はオブジェクトではないため、そのままではこのメソッドを呼び出せません。この方法を使う場合は、先にプリミティブ値をラッパーオブジェクトに変換します。型情報を扱う方法はほかにもあり、getClass()は既存のオブジェクトの実際のクラスが必要なときに便利です。
型と演算子に関する疑問は Java チュートリアル でグループ化されており、Java が typeof の問いにどう答えるかも含まれます。
Javaでオブジェクトの実行時クラスを取得する
getClass()はObjectで定義されており、呼び出し元の実行時クラスを表すClassオブジェクトを返します。たとえば、String型の参照から直接呼び出せます。このClassオブジェクトを出力すると、class java.lang.Stringのようにパッケージ名も表示されます。
次のJavaプログラムは文字列と、その文字列が参照するオブジェクトのクラスを出力します。
class RuntimeClassExample {
public static void main(String[] args) {
String message = "Hello";
System.out.println(message);
System.out.println("Class: " + message.getClass());
}
}
標準出力の例:
Hello
Class: class java.lang.String
プリミティブ値から始める場合は、getClass()を呼び出す前にIntegerやCharacterなどのラッパーオブジェクトに代入します。ボクシングによって、プリミティブ値は対応するラッパーオブジェクトに変換されます。メソッドを呼び出す時点で参照がオブジェクトを指している必要があります。null参照には呼び出し先となるオブジェクトがありません。
Javaでラッパーオブジェクトの実行時クラスを取得する
ラッパークラスを使うと、プリミティブ値を表すオブジェクトのクラスを調べられます。次の例ではIntegerとCharacterを使います。getClass()は各オブジェクトの実行時クラスを特定し、getSimpleName()はパッケージ名を含まない短いクラス名を返します。
class WrapperClassExample {
public static void main(String[] args) {
Integer count = 20;
Character letter = 'G';
System.out.println("Integer class: " + count.getClass());
System.out.println("Character class: " + letter.getClass());
System.out.println("Integer simple name: " + count.getClass().getSimpleName());
System.out.println("Character simple name: " + letter.getClass().getSimpleName());
}
}
これらの呼び出しが示すクラス名はjava.lang.Integerとjava.lang.Characterです。単純名はそれぞれIntegerとCharacterです。