在println()中输出对Annotation的引用时,不会覆盖toString()方法

时间:2011-06-17 09:49:38

标签: java

package javaapplication20;
import java.lang.annotation.*;
import java.lang.reflect.*;

@Retention (RetentionPolicy.RUNTIME)
@interface MyAnno {
    String str();
    int yu();
}
@Retention (RetentionPolicy.RUNTIME)
@interface Wasp {
    double hg();
}
@MyAnno(str = "Falcon", yu=5 )
@Wasp(hg = 54.67)
public class Main {
        @MyAnno(str = "Raptor", yu=7 )
        @Wasp(hg = 90.56)
public static void meth(){
            Main ob = new Main();
            try{
                Annotation annon[] = ob.getClass().getAnnotations();
                System.out.println("All anotations for Main are ");
                for(Annotation a : annon){
                    System.out.println(a);
                }

                Method m = ob.getClass().getMethod("meth");
                Annotation annons[] = m.getAnnotations();
                System.out.println("All Annotations for meth() are ");
                for(Annotation a : annons){
                    System.out.println(a);
                }
            }catch(NoSuchMethodException e){
                System.out.println("No Match Found");
            }
        }
    public static void main(String[] args) {
 meth();
    }

}

输出:

All anotations for Main are 
@javaapplication20.MyAnno(str=Falcon, yu=5)
@javaapplication20.Wasp(hg=54.67)
All Annotations for meth() are 
@javaapplication20.MyAnno(str=Raptor, yu=7)
@javaapplication20.Wasp(hg=90.56)

2 个答案:

答案 0 :(得分:2)

此答案隐藏在Annotation接口的javaDoc中。对于toString(),它说:

  

返回此批注的字符串表示形式。表示的细节是依赖于实现的,但以下可能被认为是典型的:

@com.acme.util.Name(first=Alfred, middle=E., last=Neuman)

这就是你在输出中看到的。 java编译器将为您的注释创建一个类文件,该类文件将具有生成此输出的toString()实现。 依赖于实现的是指 java编译器,而不是您的注释实现。

答案 1 :(得分:1)

我认为你的问题是;

@Annotation是否有toString()的默认实现?

答案是肯定的。它还有一个hashCode()和equals()的默认实现。