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)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (135件) を見る
スッキリわかるJava入門 実践編 第2版 スッキリわかるシリーズ
- 作者: 中山清喬
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: Kindle版
- この商品を含むブログを見る
EFFECTIVE JAVA 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (10件) を見る