1. 什么是注解?
注解是jdk1.5以后提出的,是用在代码里的特殊标记,可以在 编译、类加载,运行时,被读取,并执行相应的处理。
2. java提供的基本注解
- @Override: 限定父类重写方法
- @Deprecated: 标示着方法已过时,编辑器里会提出警告(删除线)
- @SuppressWarnings: 取消编辑器的警告
3. 注解的本质
(创建一个注解,javac编译,javap反编译,可以看到如下代码)
public interface Bat extends java.lang.annotation.Annotation {}
注解本质就是一个继承了Annotation接口的 接口
4. 自定义注解
- 申明格式:public + @interface + 注解名
public @interface Bat {
}
- 注解属性:注解本质就是一个接口,所有申请属性的格式,就是在接口中写方法;
public @interface Bat {
String name();
}
- 注解的属性返回值类型:
基本数据类型;String;枚举;注解类型;上述类型的数组;
- 注解的默认值:如果注解有属性,在使用时就必须为属性赋值;也可以为属性使用默认值;语法:default ;
public @interface Bat {
String name() default "baidu";
}
- 注解的使用:使用注解是,如果注解有属性值,并且没有默认值;就必须为属性赋值;
@Bat(name = "ali")
private String hobby;
如果属性名为value,并且只有一个属性时,使用时赋值可以不写属性名
@Bat("ali")
private String hobby;
5.元注解
-
@Target :标识注解可以在什么地方使用,常用取值如下:
public enum ElementType {
/** 作用于类 */
TYPE,
/** 作用于属性 */
FIELD,
/** 作用于方法 */
METHOD,
/** 参数*/
PARAMETER,
}
- @retention: 标识注解可以保留到什么阶段,取值如下:常用 runtime
public enum RetentionPolicy {
/**
* 源码
*/
SOURCE,
/**
* class字节码
*/
CLASS,
/**
*运行时
*/
RUNTIME
}
-
@Documented: 生成javadoc(api文档是,注解是否显示)
-
@Inherited: 标识父类的注解被子类继承
6. 解析注解 (反射)
获取使用注解的(对象,方法,属性等。。。)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bat {
String value() default "baidu";
}
@Bat("baidu")
public class Bussine {
}
public class Test {
public static void main(String[] args) {
//获取Class对象
Class<Bussine> bussineClass = Bussine.class;
//判断是否有此注解
boolean present = aClass.isAnnotationPresent(Bat.class);
//获取注解对象
Bat annotation = bussineClass.getAnnotation(Bat.class);
String value = annotation.value();
System.out.println(value);
}
}