什么是注解?
- 注解(
Annotation
):在JDK1.5中引入,代码中的特殊标记,这些标记可以在编译,类加载,运行时被程序读取,并执行相对应的处理。 - 注释给程序员看,注解给编译器看。
- 就目前我常用到的注解有:
@overide
,@Test
,@Autowired
,特别是自动装配的注解,提供了强大的功能。 - 基本Annotation
在java.lang
包下,用于常用于标记该方法,抑制编译器警告等。相当于给他们添加了额外的辅助信息。 - 元Annotaion
在java.lang.annotation
包下,常用于修饰其他的Annotation定义。
注解有什么作用?
- 传统方式是通过配置XML文件的方式来告诉类要如何运行。
- 现在,我们可以通过加注解的方式告诉类如何运行。
- 让编译器检查代码
- 将数据注入到方法、成员变量、类上。
内置注解
在java.lang
包下有五个基本的注解。
@Override
重写注解@Deprecated
过时注解@SuppressWarnings("all")
抑制编译器警告,all
:全部镇压@SafeVarargs
是jdk7中堆污染警告@Functionallnterface
显示指定该接口是函数式接口
元注解
负责注解其他的注解。
-
@Target
用于描述注解的使用范围(被描述的注解可以用在什么地方) -
@Retention
表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)一般都写RUNTIME
,保证在运行的时候,注解还是有效的。 -
@Document
说明该注解被包含在javadoc中 -
@Inherited
子类可以继承父类的注解
自定义注解
使用@interfae
自定义注解时,自动继承java.lang.annotation.Annotation
接口。
- 格式:
public @interface 注解名{定义内容}
,在类中声明的时候要把public
去掉。
- 在注解上定义的成员变量只能是String,数组,Class,枚举类,注解
如何使用自定义注解(反射)
- 赋值
//注解拥有什么属性,在修饰的时候就要给出相对应的值
@MyAnnotation(username = "zhangsan", age = 20)
public void add(String username, int age) {
}
- 在注解声明属性的时候,给出默认值,修饰的时候就不需要给出具体的值了。
public @interface MyAnnotation {
//定义了两个成员变量
String username() default "zicheng";
int age() default 23;
}
- 把自定义注解的基本信息注入到方法上(利用反射技术)
要事先在自定义注解上加上这样一段代码:
@Retention(RetentionPolicy.RUNTIME)
- 自动注入过程:
①反射出该类的方法
②通过方法得到注解上具体的信息
③将注解上的信息注入到方法上
//注解拥有什么属性,在修饰的时候就要给出相对应的值
@Retention(RetentionPolicy.RUNTIME)
@MyAnnotation(username = "zhongfucheng", age = 20)
public void add(String username, int age) {
}
//反射出该类的方法
Class c1 = Demo2.class;
Method method = c1.getMethod("add", String.class, int.class);
//通过该方法得到注解上的具体信息
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String username = annotation.username();
int age = annotation.age();
// 将注解上的信息注入到方法上
Object o = c1.newInstance();
method.invoke(o, username, age);
总结
- 对象注入方法的过程:
①得到想要注入到类中的属性
②得到该属性的对象
③得到属性对应的写方法
④通过写方法得到注解
⑤获取注解详细的信息
⑥将注解的信息注入到对象上
⑦调用属性写方法,将已填充数据的对象注入到方法中