注解的概述
jdk提供的注解
① @Override:告知编译器此方法是覆盖父类的
② @Deprecated:标注过时
③ @SuppressWarnings:压制警告
自定义注解
1.编写一个注解
① 关键字:@interface
② 注解的属性:返回值 名称();
③ 注解属性基本类型
· 基本类型
· String
· 枚举类型
· 注解类型
· Class类型
· 以上类型的一位数组类型
2.注解的使用:在类/方法/字段上 @xxx
//定义注解
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
//注解的属性
String name();
int age() default 28;
//String value();
//String[] value();
}
3.解析使用了注解的类
① 元注解:代表修饰注解的注解,作用是限制定义的注解的特性
· @Retention(想要解析使用了注解的类,那么该注解的Retention必须设置成Runtime)
SOURCE:注解在源码级别可见
CLASS:注解在字节码文件级别可见
RUNTIME:注解在整个运行阶段都可见
· @Target:代表注解修饰的范围(类/方法/字段)
FIELD:字段上可用此注解
METHOD:方法上可用次注解
TYPE:类/接口上可以使用此注解
② 代码实例 — 获得注解信息
//① 定义注解
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
//注解的属性
String name();
int age() default 28;
//String value();
//String[] value();
}
//② 创建一个类,在方法上有MyAnno注解
public class MyAnnoTest {
@MyAnno(name = "zhangsan")
//@MyAnno({"xxx"})
public void show(String str) {
System.out.println("show running...");
}
}
//③ 在主方法中获取注解上的信息
public class MyAnnoParser {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
//解析show方法上面的@MyAnoo
//直接的目的是获得show方法上的@MyAnno中的参数
//获得show方法的字节码对象
Class clazz = MyAnnoTest.class;
Method method = clazz.getMethod("show", String.class);
//获得show方法上的@MyAnno
MyAnno annotation = method.getAnnotation(MyAnno.class);
//获得@MyAnno上的属性值
System.out.println(annotation.name());
System.out.println(annotation.age());
//根据业务需求写逻辑代码
}
}