注解(Annotation),是jdk5.0引入的技术,用它可以对java中的某一个段程序进行说明或标注,并且这个注解的信息可以被其他程序使用特定的方式读取到,从而完成相应的操作。
- @Override 注解:
public class Person {
@Override
public String toString() {
return super.toString();
}
}
编译器在编译该类的时候,会读取到toString方法上的注解@Override,从而帮我们检查这个方法是否是重写父类中的,如果父类中没有这个方法,则编译报错。
-
注释和注解的区别:
(1)注解是给其他程序看的,通过参数的设置,可以在编译后class文件中(保留)注解的信息,其他程序读取后,可以完成特定的操作。
(2)注释是给程序员看的,无论怎么设置,编译后class文件中都是(没有)注释信息,方便程序员快速了解代码的作用或结构。 -
注解的格式:
(1)没有属性的注解:
public @interface 注解名称 {
}
(2)有属性没默认值的注解:
public @interface 注解名称 {
public 属性类型 属性名();
}
(3)有属性和默认值的注解:
public @interface 注解名称 {
属性类型 属性名() default 默认值 ;
}
- 注解的使用范围:
(1)TYPE,使用在类、接口、注解、枚举等类型上面:
@Test
public class Hello{
}
(2)FIELD,使用在属性上面:
public class Hello{
@Test
private String msg;
}
(3)METHOD,使用在方法上面:
public class Hello{
@Test
public void say(){
}
}
(4)PARAMETER,使用在方法的参数前面:
public class Hello{
public void say(@Test String name){}
}
-
包注解只能写在packages-info.java文件中。package-info.java文件里面只能包含package声明,并做出描述以便将来生成doc文件,可以从API源码src.zip中,看到每个包下面都可以对应的package-info.java文件对该包做出描述。
-
类中使用的注解,根据配置可以保持到三个不同的阶段:
(1)SOURCE,注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。(如果只是做一些检查性的操作,使用SOURCE 注解)编译时遗弃。
(2)CLASS,注解被保留到class文件,但jvm加载class文件时候被遗弃。(如果要在编译时进行一些预处理操作,就用 CLASS注解)运行时遗弃。
(3)RUNTIME,注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。(如果需要在运行时去动态获取注解信息,那只能用RUNTIME注解。) -
元注解(注解的注解)
常用的元注解有:
@Target,用于描述注解的使用范围,例如用在类上面还是方法上面;
@Retention,用于描述注解的保存策略,是保留到源代码中、Class文件中、还是加载到内存中;
@Documented,用于描述该注解将会被javadoc生产到API文档中;
@Inherited,用于表示某个被标注的类型是被继承的,如果一个使用@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Role(value=“admin”)代码,等价于@Role(“admin”),对应其他注解也同样适用。