山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

java のいろいろな型の型名を文字列で出力させてみる

DTO のテストコードを自動生成したくて、前回リフレクションの復習をした。

型の判別をするために、テスト対象となるクラスのプライベート変数の型を取得しているが、どの型がどんな文字列で表現されるのか気になったので調べてみた。

次のようなクラスを用いて、 SomeDtoクラスのプライベート変数の名前と型を表示してみる。

package org.yyama;

import java.lang.reflect.Field;

public class Main {
	public static void main(String... args) throws Exception {

		// 対象のクラスを取得
		Class<SomeDto> clazz = SomeDto.class;

		// フィールドをすべて取得する。 getFields() というメソッドもあるが、
		// それでは private メソッドを取得できない。
		Field[] fields = clazz.getDeclaredFields();

		for (Field field : fields) {
			// Field#getName() で変数名、
			// Field#getType() で型名を取得できる。
			System.out.println(field.getName() + " : " + field.getType());
		}
	}
}

基本型(プリミティブ型)

まず、基本型について確認する。

SomeDto を次のようにする。

package org.yyama;

public class SomeDto {
	private boolean vBoolean;
	private char vChar;
	private byte vByte;
	private short vShort;
	private int vInt;
	private long vLong;
	private float vFloat;
	private double vDouble;
}

そして Main クラスの main メソッドを実行した結果がこちら。

vBoolean : boolean
vChar : char
vByte : byte
vShort : short
vInt : int
vLong : long
vFloat : float
vDouble : double

完全にそのまんま表示される。

参照型(要はクラス)

次にいくつかのクラスを試してみる。 SomeDto は次のとおり。

package org.yyama;

import java.util.Date;
import java.util.List;
import java.util.Map;

public class SomeDto {
	private Integer vInteger;
	private Character vCharacter;
	private String vString;
	private Map<String, String> vMap;
	private List<String> vList;
	private Date vUtilDate;
	private java.sql.Date vSqlDate;
}

変数名と型名を取得した結果がこちら

vInteger : class java.lang.Integer
vCharacter : class java.lang.Character
vString : class java.lang.String
vMap : interface java.util.Map
vList : interface java.util.List
vUtilDate : class java.util.Date
vSqlDate : class java.sql.Date

型の前に class や interface が出力される。そしてクラス名はパッケージ付きで表示されれるため、 java.util.Date と java.sql.Date の区別もつく。

基本型の配列

では、基本型の配列を見てみる。

SomeDto。

package org.yyama;

public class SomeDto {
	private boolean[] vArrBoolean;
	private char[] vArrChar;
	private byte[] vArrByte;
	private short[] vArrShort;
	private int[] vArrInt;
	private long[] vArrLong;
	private float[] vArrFloat;
	private double[] vArrDouble;
}

main の実行結果がこちら。

vArrBoolean : class [Z
vArrChar : class [C
vArrByte : class [B
vArrShort : class [S
vArrInt : class [I
vArrLong : class [J
vArrFloat : class [F
vArrDouble : class [D

最初に class と表示されていることから、もはや基本型ではない。そして片括弧の次に大文字アルファベットが表示されている。だいたいは型の先頭 1 文字を大文字にしたものだが double は J で boolean は、なんと Z だ。

参照型の配列

最後に参照型の配列。

SomeDto。

package org.yyama;

import java.util.Date;
import java.util.List;
import java.util.Map;

public class SomeDto {
	private Integer[] vArrInteger;
	private Character[] vArrCharacter;
	private String[] vArrString;
	private Map<String, String>[] vArrMap;
	private List<String>[] vArrList;
	private Date[] vArrUtilDate;
	private java.sql.Date[] vArrSqlDate;
}

main の実行結果

vArrInteger : class [Ljava.lang.Integer;
vArrCharacter : class [Ljava.lang.Character;
vArrString : class [Ljava.lang.String;
vArrMap : class [Ljava.util.Map;
vArrList : class [Ljava.util.List;
vArrUtilDate : class [Ljava.util.Date;
vArrSqlDate : class [Ljava.sql.Date;

配列ではない場合と同じく、最初は class から始まる。interface と表示されていた Map や List も配列にすると class となる。そして片括弧の次には大文字の L (何の略だ?)。その後、パッケージ付きのクラス名が続き、最後になぜかセミコロンで終わる。

まとめ

java の型がどのような文字列で表現されるのか整理できた。

おしまい。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)