Java 入門

ホーム > リフレクション > リフレクション ~ クラス名からの Class オブジェクトの取得

リフレクション ~ クラス名からの Class オブジェクトの取得

クラス名からの Class オブジェクトの取得

さて、前回の例では Employee オブジェクトから、それに関連する Class オブジェクトを取得しました。 今回はクラスの名前から、その Class オブジェクトを取得します。

クラス名から Class オブジェクトを取得するには、 forName メソッドを利用します。

forName メソッドは文字列でクラス名を受け取り、そのクラス名に対する Class オブジェクトを返します。

package com.keicode.java.test;

public class ReflectionTestApp3 {
    
    public static void main(String[] args) {
        try {
            Class<?> c;
            c = Class.forName("com.keicode.java.test.Employee");
            System.out.println(c.getName());
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

この実行結果は当然ながら・・・

com.keicode.java.test.Employee

となります。

もしここで、存在しないクラス名 "XYZ" を渡すと、 ClassNotFoundException 例外が投げられ、 catch ブロックにて次のようなスタックトレースが出力されました。

java.lang.ClassNotFoundException: XYZ
	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:186)
	at com.keicode.java.test.ReflectionTestApp3.main(ReflectionTestApp3.java:8)

自分で書いたコードは一番下のフレーム (ReflectionTestApp3.java:8) の箇所だけですが、 Java の実行環境の内部動作の分も見えてくるのでスタックトレースはこんな風に長くなります。

» Class オブジェクトからのインスタンスの作成

ホーム > リフレクション > リフレクション ~ クラス名からの Class オブジェクトの取得