オブジェクトじゃないのに.....
2008.04.13
ちょっと遊びで書いているプログラムで、 Javaのリフレクションに関して
意外な書き方...
で?となったことがあります。それはですね、
java.lang.reflect.Method#getReturnType()
などの戻り値は、java.lang.Class なのですけども、このメソッドがたとえば、
public String getMessage() { ..... }
をリフレクトして java.lang.String を戻り値の Class として返すので、
if( String.class.equals(method.getReturnType()) {
と判定するのは勿論文句はありません。しかし、この method が、
public int getInt() { .... }
public double [] getDoubles() { ... }
をリフレクトするんだったら....となると、結構アレ?となるような書き方をしないといけません!
正解は、
if( int.class.equals(method.getReturnType()) ) {
} else if(double[].class.equals(method.getReturnType()) {
といった書き方です。ちょっと気味が悪いですね....
というのは、 Java の原理として、
int はオブジェクトではない!
という大原則があるのですが、このリフレクションの場合では、
オブジェクトだろうがプリミティブ型だろうが配列だろうが「統一的に」取り扱えなくてはならない!という事情で
int.class, double[].class
といったエキストラな書き方が導入された模様です。この書き方は、実は「classプロパティの参照」ではなくて、「int.class」という特別なリテラルだ、ということです....まあ、 Class#getMethod() するケースでの引数指定では、 java.lang.Integer で渡しちゃって全然問題がないので、これ気づきにくいんですよね....
まあ、Java というときちんとしているようで結構アバウトなところがありますから、こういうエキストラな書き方をこっそり導入したのかもしれませんね!(「リテラルだ!」と強弁するあたり、後付けっぽいですね、苦笑)
参考:JavaHouse「プリミティブ型の値をオブジェクトとして扱うには?」
投稿者 : 杉浦 こずえ | 投稿日時 : 2008.04.13 21:26
あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。





