2009年3月アーカイブ

自動生成系のコードを書いていると、うっかりinterfaceやabstractクラスが渡されてnewInstance()できず(´・ω・`)ショボーンとなり、これはいけません。

ところがClassがInterfaceかどうかはClassクラスのメソッド、isInterface()で知る事ができますが、abstractかどうかを知るメソッドが一見見あたらない。

恐らく優れた方々は普通に知っているのでしょうが、検索しても見つけられず(ま、私の探し方が未熟なんですが(汗))、仕方なくURLClassLoaderの実装を眺めていたら見つけた。

abstractなどクラス宣言に付加する修飾子(publicやfinal、staticなどもこれです)はClass#getModifiers()を使います。

ClassクラスのJavaDocをしっかり探していれば見つかったはずなのですが、分かりづらくてスルーしていた。

たぶん返り値がintだったのもスルーしていた原因です。

返り値はintの各ビットが立っているかどうかで各修飾子が付いているかどうかを表します。ビットはjava.lang.reflect.Modifierクラスの定数として定義されています。abstractなら

  (clazz.getModifiers & Modifier.ABSTRACT) > 0

こんな感じでしょうか。

Modifireクラスにはもっと便利なstaticメソッドが用意されていて、Modifire.isAbstract(clazz.getModifires())これ。

これでOK。

このアーカイブについて

このページには、2009年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年2月です。

次のアーカイブは2009年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のブログ記事

Amazon