演習課題「getNameメソッド を用いてコンストラクタインスタンスがあらわすコンストラクタの名前を取得してみよう」
現在、getName
メソッドを用いてコンストラクタインスタンスがあらわすコンストラクタの名前を取得しようとしています。Yusha
クラスのコンストラクタインスタンスがあらわすコンストラクタの名前を出力してください。
期待する出力値
Yusha
Yusha
Yusha
#05:コンストラクタの操作
このチャプターでは、リフレクションでのコンストラクタの操作について学習します。
ConstructorクラスのgetNameメソッドが返す文字列は、バイナリ名です。
バイナリ名は、基本的には完全限定名である「パッケージ名とクラスの単純名をドットで連結」したものになります。
詳細な仕様については、下記を参照してください。
The Form of a Binary
https://docs.oracle.com/javase/specs/jls/se17/html/jls-13.html#jls-13.1
プリミティブ型intを表すClassインスタンスは、Integer.TYPEで利用可能ですが、int.classとしても問題ありません。
このふたつは同じインスタンスとなります。
なお、ラッパークラス側には、同じTYPEという変数名で、それぞれプリミティブ型のインスタンスをあらわす変数が定義されています。
また、voidをあらわすクラスとしてVoidがあり、Void.TYPEはキーワードvoidをあらわすクラスインスタンスです。
これらは主にリフレクションで利用されます。// いずれも true
System.out.println(Integer.TYPE == int.class);
System.out.println(Byte.TYPE == byte.class);
System.out.println(Short.TYPE == short.class);
System.out.println(Long.TYPE == long.class);
System.out.println(Character.TYPE == char.class);
System.out.println(Float.TYPE == float.class);
System.out.println(Double.TYPE == double.class);
System.out.println(Boolean.TYPE == boolean.class);
Java7より、複数の例外に対して同じ処理を行いたい場合、個々のキャッチ節を記述せずに|を用いてまとめることができます。} catch (AException e) {
} catch (BException e) {
}} catch (AException | BException e) {
}
総称型を使うことで、以下のようにインスタンスを生成することもできます。Class<A> a1 = A.class;
Class<? extends A> a2 = (new A()).getClass();
try {
Constructor<A> c1 = a1.getDeclaredConstructor();
A o1 = c1.newInstance();
Constructor<? extends A> c2 = a2.getDeclaredConstructor();
A o2 = c2.newInstance();
} catch (NoSuchMethodException | IllegalAccessException
| InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}