[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12155] Re: (議事録)J2SE 5.0 Tiger 第3回 ( Annotation のデフォルト値)



  高橋(智)です。

"TAKAHASHI,Toru" wrote:
snip 
> □7.2.7 デフォルト値の指定
> 
> [質問]@RequestForEnhancementのdefaultを削除して、
> RequestForEnhancement.classだけを再コンパイルして配布(置き換え)すると
> どうなるか?
>         → 利用側にはインライン展開されないので、何らかのエラーが
>         出るのではないか?
>         [宿題]何が発生するか調べよう

  以下のような手順で、defaultを削除して再コンパイルした状態で、Annotationに
アクセスしてみました。
  問題のAnnotationで修飾されたクラスは、フツーにロードできたのですが、testの
値を読み出す際に java.lang.annotation.IncompleteAnnotationException という
例外が送出されました。
  やはり、いったん default を定義したら、default を止めるのは避けたほうが良い
と思われます。

  あと、例外のスタックトレースに出てくる
    at $Proxy3.test(Unknown Source)
の $Proxy3 は、何なのでしょうか?

========================================================================
ken@imacg5 src>java -version
java version "1.5.0_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-83)
Java HotSpot(TM) Client VM (build 1.5.0_05-48, mixed mode, sharing)

ken@imacg5 src>cat untitled1/MyAnno.java
package untitled1;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnno {
  String test() default "testdefault";
}

ken@imacg5 src>cat untitled1/Untitled1.java
package untitled1;
@MyAnno()
public class Untitled1 {
  public static void main(String[] args) {
      if(args[0].equals("test1")) {
          System.out.println(Untitled1.class.getName());
      }
      else if(args[0].equals("test2")) {
          MyAnno anno = Untitled1.class.getAnnotation(MyAnno.class);
          System.out.println(anno.test());
      }
  }
}

ken@imacg5 src>javac untitled1/*.java
ken@imacg5 src>java untitled1.Untitled1 test1
untitled1.Untitled1
ken@imacg5 src>java untitled1.Untitled1 test2
testdefault

ken@imacg5 src>cat untitled1/MyAnno.java
package untitled1;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnno {
    //String test() default "testdefault";
    String test();
}

ken@imacg5 src>javac untitled1/MyAnno.java
ken@imacg5 src>java untitled1.Untitled1 test1
untitled1.Untitled1
ken@imacg5 src>java untitled1.Untitled1 test2
Exception in thread "main" java.lang.annotation.IncompleteAnnotationException: untitled1.MyAnno missing element test
        at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:53)
        at $Proxy3.test(Unknown Source)
        at untitled1.Untitled1.main(Untitled1.java:10)
========================================================================

-- 
高橋智宏
  Java読書会( http://www.javareading.com/bof/ )