分类:按运行机制分有源码注解,编译时注解,运行时注解
源码注解:编译时丢弃
编译时注解:注解在源码和.class文件中都存在,编译时起作用@override、@Deprecated、@Suppvisewarnings。
运行时注解:在运行时还起作用@Autowired
元注解:注解的注解
@Target({ElementType.METHOD,ElementType.TYPE})//注解的作用域,有CONSTRUCTOR FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE
@Retention(RetentionPolicy.RUNTIME)//生命周期SOURCE,CLASS,RUNTIME 在什么阶段起作用
@Inherited 允许子类继承
@Document 生成javadoc时会包含注解的信息
自定义注解
//1成员必须无参无异常,类型有String,Class,Annotation,Enumeration,
//2如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//3注解类可以没有成员,没有成员的注解为标识注解
public @interface Description{ //使用@interface关键字定义注解
String desc();
Stirng author();
int age() default 10; //4可以用default为成员指定一个默认值
}
使用注解的语法:
@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值12,…)
@Description(desc="i am eyeColor",author="xiao chen",age=18)
public String eyeColor(){
return "red";
}
使用注解
@Description(desc="yyy",author="xiao chen",age=19)
public class Child {
@Description(desc="yyy",author="xiao chen",age=19)
public String name() {
return null;
}
}
解析注解
public class ParseAnnotation {
public static void main(String[] args){
//1.使用类加载器加载类
try {
Class c=Class.forName("com.annotation.test.Child");
//2.找到类上面的注解
boolean isExist=c.isAnnotationPresent(Description.class);//判断是否存在Decription这个注解
if(isExist){
//3.拿到注解实例
Description d=(Description)c.getAnnotation(Description.class);
System.out.println(d.desc()+d.author()+d.age());
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}