1 なぜクラスオブジェクトを取得する必要があるのでしょうか?
クラス情報やメソッドを取得したい場合は、Javaのリフレクション機構を利用することで、プログラム実行中にコードをアセンブルしたり、動的エージェントを実装したりすることで、より柔軟にコードを書くことができます。
リフレクション メカニズムにより、プログラムは実行時に既知の名前を持つクラスの内部情報を取得できます。
クラス オブジェクトとコンテンツ情報を取得するには、主に 3 つの方法があります。
2 getClass() メソッドを使用する
2.1 人物クラスの作成
package com.clazz;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.2 テストクラスの作成
package com.clazz;
public class Test {
public static void main(String[] args) {
Person person = new Person();
Class clazz = person.getClass();
System.out.println(clazz.getName());
}
}
出力結果は、クラスの完全なパッケージ パス名とクラス名です。
com.clazz.パーソン
注意する必要があるのは、同じクラスに対して複数のオブジェクト インスタンスが同時に作成される場合、実際にはクラス オブジェクトのコピーは 1 つだけであるということです。
Person person1 = new Person();
Person person2 = new Person();
System.out.println(person1.getClass() == person2.getClass());
走った結果は真実です。
3 クラスの静的属性を使用する
このメソッドはクラスのインスタンス化を必要とせず、クラスのクラス static 属性を使用してクラスのクラス オブジェクトを直接取得できます。
package com.clazz;
public class Test {
public static void main(String[] args) {
Class<Person> personClass = Person.class;
System.out.println(personClass.getName());
}
}
出力結果は、クラスの完全なパッケージ パス名とクラス名です。
com.clazz.パーソン
4 Class クラスで静的メソッド forName() を使用します。
この方法でクラスオブジェクトを取得するには、forName()メソッドに取得したいClassオブジェクトクラスのフルパス、つまりパッケージ名+クラス名を指定する必要があります。
package com.clazz;
public class Test {
public static void main(String[] args) {
try {
Class<?> aClass = Class.forName("com.clazz.Person");
System.out.println(aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
出力結果は、クラスの完全なパッケージ パス名とクラス名です。
com.clazz.パーソン
ここで注意が必要な問題があり、このクラスのフルパス情報を手動で指定しているため、パッケージが弊社で導入されていない可能性や、パッケージ名やパス情報が手スライドで誤って入力されている可能性があり、エラーが報告される可能性があるため、このメソッドでは外部に例外をスローする必要があります。