アノテーション

JSFがうまくいかないのでちょっとアノテーションで遊ぶことに。

アノテーションjavassist+javaagentでちょっとクラスのアクセス制限みたいなことを試してみる。

関係ないけど、java + assist かと思ったら違うんだな。aは1つでjavassist(ジャバシスト?)。

で、お約束通りまたはまっててさっき解決した教訓。

@interfaceはObjectのサブクラスじゃないからtoString()がない!?
javassistでAnnotationインスタンスを取得してtoString()をすると、RuntimeExceptionが発生する

java.lang.RuntimeException: no default value: delf.annotation.access.AccessDeny.toString()
	at javassist.bytecode.annotation.AnnotationImpl.getDefault(AnnotationImpl.java:88)
	at javassist.bytecode.annotation.AnnotationImpl.invoke(AnnotationImpl.java:59)
	at $Proxy1.toString(Unknown Source)
 ...

つまり、デバッグ目的で安易に


Annotation annotation = ....;
System.out.println(annotation);

とかやっちゃうと、RuntimeExceptionが発生するというわけ。

javaagent経由でやってるとなぜか例外が握りつぶされてしまうので、何が起きてるかわからない、ひどい状態になる。気をつけよう。