JAVA注解(JDK1.5开始)
JAVA注解(JDK1.5开始)-FROM IMOOC
概念:Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
·Java中的常见注解
1)JDK自带注解
@Override覆盖父类方法
@Deprecated不赞成,反对 (过时了,标注于相应的方法之上),如果此时仍然要使用(在别的程序)@SuppressWarnings("deprecation"),来忽略该警告
@SuppressWarnings("deprecation")
2)常见第三方注解
Spring:@Autowired
@Service
@Repository
Mybatis:@InsertProvider
@UpdateProvider
@Options
注解分类
按照运行机制分:
源码注解:注解只在源码中存在。
编译时注解:注解在源码和.class文件中都存在。(如:@Override@Deprecated@SuppressWarnings)
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。(如:@Autowired)
按照来源分:
JDK自带注解:
第三方注解:打交道的发部分注解。
自定义的注解:
元注解:注解的注解。
自定义注解
1)自定义注解的语法要求
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//[rɪˈtɛnʃən] n. 保留;记忆力,保持力;滞留,扣留;闭尿
@Inherited
@Documented
public @interface Description{ //使用@intreface关键字定义注解 Description为注解名
String desc(); //成员以无参无异常方式生命
String author();
int age() default 18;//可以用default为成员指定一个默认值
//1.成员类型是受限的,合法的类型包括原始类型以及String,Class,Annotation,Enumeration
// enumeration [ɪˌnju:mə'reɪʃn] n. 计数,列举;细目;详表;点查 Annotation[ˌænə'teɪʃn] n.注释
//2.如果注解只有一个成员变量,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//3.注解类可以没有成员,没有成员的注解成为标识注解
}
2)注解的注解(元注解)
@Target({ElementType.METHOD,ElementType.TYPE}) //注解的作用域
//注解的作用域列表
CONSTRUCTOR(构造函数声明) FIELD(字段声明) LOCAL_VARIABLE(局部变量声明) METHOD(方法声明) PACKGE(包声明) PARAMETER(参数声明) TYPE(类接口)
@Retention(RetentionPolicy.RUNTIME)//生命周期
//SOURCE:只在源代码显示,编译时会丢失
//CLASS:编译时会记录到class中,运行时忽略
//RUNTIME:运行时存在,可通过反射读取
@Inherited//标示性的元注解,表示允许子类继承(既,接口不可继承)。只能继承到类级别,方法上的无法继承
@Documented//生成Javadoc时会包含注解信息
3)使用自定义注解
使用注解的语法:
@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,...)
@Description(desc ="I am eyeColor",author="C boy",age=18)
public String eyeColor(){
return "red";
}
4)解析注解
概念:通过反射获取类,函数或者成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
main(String[] args){
try{
//1.使用类加载器
Class c1 =Class.forName("com.ann.test.Prg1");
//2.找到类上的注解 此处找的是Description
boolean isExist = c.isAnnotationPresent(Description.class);
if(isExist){
//3.拿到注解实例get annotation instance
Description d = (Description)c.getAnnotation(Descrition.class);
System.out.println(d.value());
}
//4.找到方法上的注解
Method[] mth = c.getMethods();
for(Method m :mth){
boolean isMthExist = isAnnotationPresent(Description.class);
if(isMthExist){
Description d = (Description)c.getAnnotation(Descrition.class);
System.out.println(d.value());
}
}
//另一种解析方法
Method[] mth = c.getMethods();
for(Method m :mth){
Annotation[] as = m.getAnnotations();
for(Annotation a:as)
if(a instanceof Description){
Description d = (Description)a;
System.out.println(d.value());
}
}
}catch(){
e.print
}
}
5)