自動生成系のコードを書いていると、うっかり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。