注解->注解解析->元注解
注解
概念:注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac
编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种 标记,看你的程
序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量
上。
常见注解
1. @author:用来标识作者名,eclipse开发工具默认的是系统用户名。
2. @version:用于标识对象的版本号,适用范围:文件、类、方法。
3. @Override :用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方
法,则编译失败
自定义注解
1.自定义注解格式:
修饰符 @interface 注解名{
属性
}
2.属性的定义格式:为了提高注解作用
- 格式1:数据类型 属性名();-->没有默认值的-->需要后面赋值 例如:String name();
- 格式2:数据类型 属性名() default 默认值;-->可以改变的 int age() default 11;
3.注解中能够定义什么样的属性
- 八种基本数据类型(int,float,boolean,byte,double,char,long,short)。
- String类型,Class类型,枚举类型,注解类型。
- 以上所有类型的一维数组。int[][] arr = {{1,2},{3,4}} [0][0] [1,0]->3
注解解析:
可以通过注解解析判断这个类/成员变量/成员方法上有咩有相关的注解
有关的方法:
接口 AnnotatedElement 方法:
1判断方法
* boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
* 解释: 1.方法的调用者是要判断的类的.class对象 2.参数中传入的是要判断的注解的class对象
* 返回值是布尔值: 返回的true,该对象上有注解,返回的是false,该对象没有注解
2获取注解的方法 在判断为true时可以获取注解对象
<T extends Annotation> getAnnotation(Class<T> annotationClass)
* 1.方法的调用者是要判断的类的.class对象 2.参数中传入的是要获取的注解的class对象
* 解释: 参数传递是任意注解的class文件对象
* 传递什么类型,返回什么类型
元注解
用途:用来给自定义注解注解一些信息:
@Target用来定义注解的使用范围
@Retention用来定义注解的生命周期 比如存在于内存或者class中还是source中
@Target 指示其他注解,出现的位置->点进Target底层
* ElementType[] value(); 数组,可以赋值多个->点ElementType底层
* ElementType是数据类型,是枚举
* 枚举的属性,都是静态修饰,直接类名调用
* TYPE, 其他注解可以写在类上
* FIELD,其他注解可以写在成员变量
* METHOD,其他注解可以写在方法上
* PARAMETER,其他注解可以写在方法参数上
* CONSTRUCTOR,其他注解可以写在构造方法上
* @Retention 指示其他注解的生命周期->点到Retention底层
* RetentionPolicy value(); 不是数组,赋值一个->点到RetentionPolicy底层
* RetentionPolicy数据类型
* 枚举的属性,都是静态修饰,直接类名调用
* SOURCE(默认级别) 注解仅存在于源码中java文件中(不在class文件中,也不在方法区中)->@Override只是检 测方法是否为重写方法
* CLASS 注解存在于编译后的class文件中->Class文件中出现了,方法区中没有
* RUNTIME 运行时期的内存中-->方法区中出现了,一旦在方法区中出现了,我们才能利用反射获取到注解
利用自定义注解模拟junit
自定义MyTest注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyTest { } 测试解析带有@MyTest的方法 public class Test01 { @MyTest public void method01(){ System.out.println("我是method01"); } public void method02(){ System.out.println("我是method02"); } @MyTest public void method03(){ System.out.println("我是method03"); } public static void main(String[] args) throws Exception { //1.获取Class对象 Class aClass = Test01.class; Object o = aClass.newInstance(); //2.获取方法 Method[] methods = aClass.getMethods(); for (Method method : methods) { boolean b = method.isAnnotationPresent(MyTest.class); if (b){ method.invoke(o); } } } }