目录
一.注解概述
1.什么是注解?
定义︰注解(Annotation ) ,也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
2.注解的作用
- 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
- 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
3.JDK预定义的注解
@Override:检查被该注解标注的方式是否是继承自父类【接口】
@Deprecated:该注解表示注释的内容过时
@SuppressWarnings:压制警告
二.自定义注解
注解的格式:
//元注解
public @interface 注解名称 {
//属性列表
}
1.属性列表
本质:注解的本质就是一个接口;
@interface通过javap反编译后就是 interface extends java.lang.annotation.Annotation
所以@interface声明就代表一个接口继承java.lang.annotation.Annotation
属性:在注解中定义的抽象方法
返回结果必须是如下类型
1.基本数据类型
2.string类型3.枚举类型
4.注解
5.以上类型的数组
属性赋值的注意点:
1.如果定义的属性时,使用default关键字给属性默认初始值,可以在使用注解是不赋值
2.如果只有一个属性需要赋值,而且该属性的名称是value ,那么在赋值时value可以省略
3.数组赋值时,如果属性为数组且只有一个值,则可以省略大括号
2.元注解
JDK中提供的4个元注解
1.@Target:描述当前注解能够作用的位置
ElementType.TYPE:可以作用在类上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成员变量上2.@Retention:描述注解被保留到的阶段
SOURCE< CLASS < RUNTIMESOURCE:表示当前注解只在代码阶段有效
CLASS:表示该注解会被保留到字节码阶段
RUNTIME:表示该注解会被保留到运行阶段JVM
自定义的注解︰RetentionPolicy.RUNTIME
3.@Documented:描述注解是否被抽取到avaDoc api中
4.@inherited:描述注解是否可以被子类继承
3.自定义注解与反射实现功能
想实现的功能:注解有两个属性 一个代表类名 一个代表方法名 实现这个类中的这个方法
自定义注解:
/**
* 自定义注解
* 给一个类名 一个方法名 实现这个类中的这个方法
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
//类名
String className();
//方法名
String methodName();
}
自定义类:
public class Demo1 {
public void sayHello() {
System.out.println("hello~~~~");
}
}
注解加反射实现:
@MyAnno(className = "com.anno.Demo1",methodName = "sayHello")
public class DemoTest {
public static void main(String[] args) throws Exception {
//获取当前类的class对象
Class<DemoTest> demoTestClass = DemoTest.class;
//获取注解
/**
* 注解的本质是个接口
* getAnnotation()相当于获取我们的注解的实现类
* public anno implements MyAnno {
* //相当于实现一个方法 来 返回我们注解中的属性
* String className() {
* return className;
* }
* String methodName() {
* return menthodName;
* }
* }
*/
MyAnno anno = demoTestClass.getAnnotation(MyAnno.class);
//获取全类名
String className = anno.className();
//获取方法名
String methodName = anno.methodName();
// System.out.println(className);
// System.out.println(methodName);
//通过反射 实现我们想实现的功能
Class<?> clazz = Class.forName(className);
Method method = clazz.getDeclaredMethod(methodName);
//执行对应的方法
method.invoke(clazz.newInstance());
}
}
结果:
hello~~~~