Java Classクラス
Classクラスは、オブジェクトやインターフェースのランタイム状態を保存する。Class型のオブジェクトは、クラスがロードされるときに自動的に生成される。Classオブジェクトを明示的に宣言することはできず、一般的にはObjectクラスのgetClass()メソッドを利用してClassオブジェクトを取得する。
Classメソッド
| メソッド | 説明 |
|---|---|
static Class<?> forName(String className) |
パラメータとしてclassNameを受け取り、クラスをロードした後、そのクラスに該当するClassオブジェクトを返す。 |
String getName() |
クラス名を返す。 |
Class<? super T> getSuperclass() |
スーパークラスを返す。 |
T newInstance() |
Classが含んでいるクラスのインスタンスを生成する。 |
Classの例
例 1)
package com.devkuma.tutorial.java.lang;
class Parent {
int a = 2;
int b = 3;
}
class Child extends Parent {
int c = 4;
}
public class ClassClass {
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
Class<?> pc = p.getClass();
Class<?> cc = c.getClass();
System.out.println("pc ClassName:" + pc.getName());
System.out.println("pc Super ClassName:" + pc.getSuperclass().getName());
System.out.println("cc ClassName:" + cc.getName());
System.out.println("cc Super ClassName:" + cc.getSuperclass().getName());
}
}
実行結果:
pc ClassName:com.devkuma.tutorial.javalang.Parent
pc Super ClassName:java.lang.Object
cc ClassName:com.devkuma.tutorial.javalang.Child
cc Super ClassName:com.devkuma.tutorial.javalang.Parent
例を見ると、クラス名とスーパークラス名を画面に表示していることを確認できる。
例 2)
package com.devkuma.tutorial.javalang;
class Calc {
int a = 2;
int b = 3;
public int sum() {
return a + b;
}
}
public class ClassClass2 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> clazz = Class.forName("com.devkuma.tutorial.javalang.Calc");
Calc calc = (Calc) clazz.newInstance();
System.out.println("sum : " + calc.sum());
}
}
実行結果:
sum : 5
これまではオブジェクトを生成するためにnewを使用してきた。上の例では、newを使わずにClass.forNameとnewInstance()メソッドを利用してオブジェクトを生成している。これはクラスが通常のロード時にロードされるのではなく、Class.forName()を実行したときにロードされるということである。これをランタイム動的ロードという。この方式はセキュリティや品質面で問題がある可能性があるため、JDBCロードのような特別な場合を除き、このようにクラスを生成することは避けるべきである。