Demo.java
package day02.anno;
//函数名可以直接作为注解对象的一个属性使用
//@MyAnno(show="aaa",{4,2,6})
//@MyAnno(IsDemo.NO)
@MyAnno(name=@SuperAnno(qq="mmmmmmmm"))
public class Demo {
//ALT+Shift+S快捷键
@Override
//枚举加在方法上
//@MyAnno(show="kkkkkkkk",value={1,4,3})
public String toString() {
// TODO Auto-generated method stub
//return super.toString();等同于下面的方法
/* return this.getClass().getName()+"@"+Integer.toHexString(this.hashCode());
*/
return "Demo haha";
}
}
MyAnno.java
package day02.anno;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnno {
String show()default "qqqq";
//int value();
SuperAnno name();
}
枚举:IsDemo.java
package day02.anno;
public enum IsDemo {
OK,NO;
}
注解SuperAnno.java
package day02.anno;
public @interface SuperAnno {
String qq();
}
测试AnnoDemo.java
package day02.anno;
import java.lang.reflect.Method;
import java.util.Arrays;
public class AnnoDemo {
/**注解Annotation
* 通过toString(),equals(),hashCode()示例引出注解
* 通过示例发现,只有到了运行时才出现结果,加上注解,在编译时期出现提示。
* @throws Exception
* @throws SecurityException
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) throws SecurityException, Exception {
// TODO Auto-generated method stub
/*Demo d=new Demo();
System.out.println(d.toString());*/
//通过反射机制拿到注解中枚举中的内容
Class clazz=Demo.class;
//获取方法上的注解
Method method=clazz.getMethod("toString", null);
MyAnno anno1=(MyAnno)method.getAnnotation(MyAnno.class);
//System.out.println(anno1.show()+Arrays.toString(anno1.value()));
//获取类上的注解
MyAnno anno=(MyAnno)clazz.getAnnotation(MyAnno.class);
//System.out.println(anno.show()+Arrays.toString(anno.value()));
//System.out.println(anno1.show()+anno1.value().ordinal());
/*IsDemo d=anno.value();
System.out.println(anno.show()+d.valueOf("NO"));*/
System.out.println(anno.show()+" "+anno.name().qq());
}
}