アノテーションの属性を取得時、配列型の属性が取得できない。
アノテーションプロセッサの便利さに、調子にのってXMLPullParserからPOJOを自動生成するための実装を行っている。
対象のクラス又はインタフェースに以下のようなアノテーションを記述することで、予め決められた抽象クラスを継承しつつ、XMLのエレメントと1:1に対応したフィールド(型はStringしか考慮しない)とアクセサを備えたJavaクラスのソースコードを生成する。
- XMLAutoBean.java
@Documented
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface XmlAutoBean {
boolean getter() default true;
boolean setter() default true;
String[] elements() default {};
}
アノテーションプロセッサで現在処理している@XmlAutoBeanアノテーションの属性を取得するには、アノテーションのミラー型(疑似型)であるAnnotationMirrorを取得した後に以下のようなコードを書く。
protected void obtainAttribute(TypeElement typeElement, AnnotationMirror annotation) {
boolean getter = true;
boolean setter = true;
String xmlElements;
//アノテーションの属性値を取得する
Iterator i = annotation.getElementValues().entrySet().iterator();
while ( i.hasNext() ) {
Map.Entry m =
(Map.Entry)i.next();
//getter
if ( m.getKey().getSimpleName().contentEquals("getter") ) {
getter = (Boolean)m.getValue().getValue();
continue;
}
//setter
if ( m.getKey().getSimpleName().contentEquals("setter") ) {
setter = (Boolean)m.getValue().getValue();
continue;
}
//elements
if ( m.getKey().getSimpleName().contentEquals("elements") ) {
xmlElements = (String )m.getValue().getValue();
continue;
}
}
}
これで良いはずだが、要素"elements"を取得して文字配列にキャストした所で例外が発生する。
java.lang.ClassCastException: java.util.Collections$UnmodifiableRandomAccessList cannot be cast to [Ljava.lang.String;
..文字配列のはずがリストが戻ってきている。何故だろう。
取りあえず以下のようにリストで受けるように修正したことで属性値を取得できるようになったのだが釈然としないのだった。
// elementts
List xmlElements = new ArrayList();
//elements
if ( m.getKey().getSimpleName().contentEquals("elements") ) {
List l = (List)m.getValue().getValue();
for ( AnnotationValue o : l ) {
xmlElements.add(o.toString());
}
continue;
}
※コメントで指摘いただいたが、javaの仕様だった。
また大して調べずに書いてしまったようで、恥ずかしい限りだ。