java提供了一种原程序的元素关联人和信息和人和元数据的途径和方法,那就是注解。
一、java中的常见注解:
1、JDK自带注解
@Override
表明当前类实现自一个接口,这个注解表明当前方法必须是实现的接口的实现版本
@Deprecated
表明当前表示的方法已经过时,调用该方法的时候出现横线,说明该方法过时了
@Suppvisewarnings
表明当前方法中某些代码忽略某些警告
2、常见第三方注解
Spring
@Autowired
@Service
@Repository
Mybatis
@InsertProvider
@UpdateProvider
@Options
二、java的注解分类:
1、按照运行机制分类
源码注解
注解只是在源码中存在,编译成.class时就不存在
编译注解
源码和.class中都存在(JDK自带的注解)
运行注解
在运行阶段还会起作用(@Autowired)
2、按照来源分
来自JDK的注解
来自第三方注解
自定义注解
3、元注解
给注解定义注解
三、java自定义注解:
@Target({ElementTyoe.METHOD,ElementType.Type})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description{
String desc();
String author();
int age() default 18;
}
语法解析:
1、使用@interface关键字来定义注解
2、成员以无参无异常方式声明
3、可以给成员指定一个默认值
4、成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration
5、如果注解只有一个成员,则成员名必须取名为value(),当然可以不需要这么做,这只是一种规定。在使用时可以忽略成员名和赋值号(=)
6、注解类可以没有成员,没有成员的注解称为标识注解
7、@Target定义作用位置,可以同时声明多个作用位置(几乎涵盖了类所有的地方)并不存在包含关系,是什么作用位置,那么就只能作用这一个位置
8、@Retention定义声明周期(可选值为source(只在源码显示)、class(编译时会记录到class中,运行时忽略)、runtime(运行时显示))
9、@Inherited是可以允许子类继承(并且只会继承这个类上面的注解,方法上的注解不会被继承)
10、使用自定义注解
使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,……)
四、解析注解
概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制层序运行的逻辑
1、使用类加载器加载类
2、找到类上面的注解(先使用isAnnotationPresent(注解名)判断是否有注解)
3、拿到注解实例(getAnnotation(注解名))(可以使用注解实例.value()来获取该注解的值,也就是该注解括号中的内容)
4、找到方法上的注解