注解的概念
注解可以简化大量操作,一般情况下,如果想封装框架,自己封装一些东西,都离不开注解
注解:一种代码级别的说明。是JDK1.5以后版本引入的一个特性,与类,接口,是同一个层次,可以声明在包,类,字段,方法,局部变量,方法参数等的面前,用来对这些元素进行说明,注释。简化代码
作用分类:
- 编写文档:通过代码里标识的注释生成文档
- 代码分析:通过代码里表示的注释对代码进行解析
- 编译检查:通过对代码里的标识的注释让编译器能够实现基本的编译检查@override
注释的分类
1.内置注解
@Override 检查方法是否重写父类的方法
@Deprecated 声明该方法已经是过时的方法
@SuppressWarnings(“all”) 干掉警告
2.自定义注释
创建一个Annotation注释类
本质接口
该类就是接口;继承了Annotation接口
返回值数据类型
-
基本数据类型
byte、short、int、long、float、double、Boolean、char
-
String类型
-
枚举类型enum
-
注释类型
-
以上类型的数组
定义过属性后需要给属性赋值,也可以设置默认值default
正规格式:@自定义类型名(name=“aaa”)
只有value属性名可以省略不写,直接在括号内写属性值
3.元注解
注解类必备注解
**@Target:**用来约束注解可以使用的地方(方法,类,字段等)
@target(Element.Type.field ;menthod)
**@Retention:**用来约束注解的生命周期
@Retention(RetentionPolicy.source;class;rentime)
-
源码级别(source)
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
-
类文件级别(class)
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
-
运行时级别(runtime)
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
**@Documented:**描述注解是否被抽取到api文档中
**@Inherited:**描述注解是否被子类继承
解释注解
@Target(ElementType.TYPE) //定义注解可以使用的位置
@Retention(RetentionPolicy.RUNTIME) //定义注解都可以保留的位置
public @interface MyAnno{
String className();
String methodName();
}
定义一个被调用到的类
public class People{
public void test(){
System.out.println("执行了People类中的test方法");
}
}
定义一个测试类
@MyAnno(className = "com.qy129.test.People",methodName = "test") //className里面放的路径,methodName里面放的是该类的方法名
public class PeopleTest{
public static void main(String[]args)throws Exception{
//1.解析注解
//获得获取该类的字节码对象
Class<PeopleTest> pc=PeopleTest.class;
//2.获取上边的注释对象
MyAnno anno = pc.getAnnotation(MyAnno.class);
//3.调用注解对象中的抽象方法
String className = anno.className();//得到上边注释中方法类名
String methodName = anno.methodName();//得到上边注释中的类中的方法名
System.out.println(className+"====="+methodName)//输出上面得到的值为了证实
//4.根据读取到的className加载该类进入内存
Class<?>name = Class.ForName(className);
//5.创建对象
Object o = name.newInstance();
//6.根据读取到的方法的名字获取方法对象
Method method = name.getMethod(methodName);
//7.执行方法
method.invoke(o);
}
}