【Java】注解的使用
1.注解是什么
这个注解表示该方法是重写的
- jdk 5.0 新增的功能。
- 注解:Annotation,代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,通过使用注解,可以在源文件中嵌入一些补充信息。
- 框架 = 注解 + 反射机制 + 设计模式。
- JavaSE中注解一般用来标记过时的功能,忽略警告等;JavaEE/Android中注解可以用来配置应用程序的切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
2.注解的使用
- 生成doc文档
- 编译时格式检查(jdk内置的)
- @Override:重写父类方法。
- @Deprecated:所修饰的元素(类、方法等)已过时。
- @SuppressWarnings(""):抑制编译警告(null警告、拆箱装箱警告等)
- 跟踪代码依赖性,实现替代配置文件(@Controller、@Resource)
@SuppressWarnings("all")
public class AnnoTest01 {
@Override
public String toString() {
return "AnnoTest01{}";
}
@Deprecated
public void displayTV(){
//过时了,不推荐使用,但可以使用
}
public void displayAll(){
//更好的方法
}
}
3.元注解
对现有的注解进行解释说明的注解
jdk提供的4种元注解
- @Retention:指定修饰注解的生命周期,该注解被保留到哪个阶段。
- SOURCE:代码阶段有效
- CLASS:会被保留到字节码阶段
- RUNTIME:会被保留到运行阶段
- @Target:指定修饰注解能用于修饰哪些程序元素(方法、属性、构造器...)。
- @Documented:指定修饰的注解在被javadoc解析时保留下来。
- @Inherited:指定修饰的注解具有继承性。
4.自定义注解
- 使用@interface修饰。
- 内部定义成员,通常使用value表示,可以指定默认值。
- 没有成员则表示一个标识作用。
- 通常都会指明两个元注解@Retention、@Target
自定义注解名字叫Hello
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface Hello {
String userName();
int age() default 10;
}
使用
@Hello(userName = "张三",age = 50)
public class Person {
}
5.通过反射获取注解信息
只有声明为RUNTIME生命周期的注解,才能通过反射获取
6.jdk 8中注解的新特性
- 可重复注解:@Repeatable
- 类型注解:@Target中新增类型
- ElementType.TYPE_PARAMETER:表示该注解能卸载类型变量的声明语句中(如泛型声明)。
- ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。
想重复使用@Hello注解,自定义两个注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Repeatable(World.class)
public @interface Hello {
String userName();
int age() default 10;
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface World {
Hello[] value();
}
使用
public class Person {
@Hello(userName = "张三",age = 18)
@Hello(userName = "李四",age = 20)
public void who(){
}
}
参考链接
1.注解@Repeatable详解