« 非数(NaN) | Main | 普通紙FAX »

2007.03.19

Java6でClass.forName(String)

 Java5でGenericsが導入され、それに伴い、Class.forName(String)の部分において、それまでと同じ記述方法だと警告が出るようになってしまいました。

 例えば、Java1.4だと

Class hogeClass = Class.forName("Hoge");

Class[] parameters = { Class.forName("java.lang.String") };

Object[] paramvalue = { aParamvalue };

Hoge hoge = (Hoge)hogeClass.getConstructor(parameters).newInstance(paramvalue);

ってな感じで、HogeクラスのHoge(String)コンストラクタを経由して初期化することができていましたが、このままだと型の安全性の点で警告が表示されてしまいます(以下はEclipse3.2(英語版)でのメッセージ)。
Type safety: The method getConstructor(Class...) belongs to the raw type Class. References to generic type Class<T> should be parameterized

 いろいろと調べてみたところ、たまにっき。にて方法が書かれていました。

 上記の例を書き換えると、

Class<?> c = Class.forName("Hoge");

Class<? extends Hoge> hogeClass = c.asSubclass(Hoge.class);

Class parameters = Class.forName("java.lang.String");

Hoge hoge = hogeClass.getConstructor(parameters).newInstance(aParamvalue);

こんな感じになるようです。getConstructorやnewInstanceの引数ががClass[]やObject[]からClass...やObject...に変更されているので、その部分を少しスマートに書けるようになった感じ? 最後の行は、
Hoge hoge = hogeClass.getConstructor(String.class).newInstance(aParamvalue);

ってのもありだと思います(この場合、3行目のClass.forNameは不要となります)。

 とりあえずは、これで警告なしにコンパイルが通るようになりました・・・が、なんか、いまいちしっくりこない・・・というか、目的のClassオブジェクトを取得するために2段階に分けて書かなければいけないのに若干の違和感を感じてしまいます。

#ちなみに、タイトルがJava6になっているのは、確認をしたのがJava5ではなくJava6だったので(^^;;

|

« 非数(NaN) | Main | 普通紙FAX »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference Java6でClass.forName(String):

« 非数(NaN) | Main | 普通紙FAX »