annotation注解

注解和注释的区别:

  注释:给程序员看的;
  注解:给虚拟机看的,让虚拟机看到程序中的注解,注解代表程序的一些特殊功能。

jdk中提供的注解:

  @Override 描述子类重写父类的方法
    jdk1.5版本的时候,该注解只能应用在类的继承上。
    jdk1.6版本的时候,该注解可以应用在类的实现上。
  @SuppressWarnings() 用来压制警告
    eg: @SuppressWarnings("all") 压制所有警告
  @Deprecated 描述方法过时

自定义注解:(结合反射才会有意义)

  定义类 class
  定义接口 interface
  定义枚举 enum
  定义注解 @interface

定义注解的属性:

  注解的属性的类型:
    基本数据类型,字符串类型,Class类型,注解,枚举,以及以上类型的一维数组
  注解的属性定义语法:
    在变量后加括号;
      eg: int a();
  注解的属性默认初始值设置:
    使用default 关键字;
    eg: boolean b() default true;
  注意:当你所定义的属性只有一个时且该属性名为value那么在使用该注解时可以直接写数值,不用写属性名;
  当你所定义的属性有多个,但是除去名为value的属性,其他属性具有default值,那么在使用该注解时亦可以直接写数值不用写属性名;
    eg: //定义注解
    @interface Annos{ String value();}
      //使用注解
    @Annos("zhangsan")
    public class demo{ }

eg:

package annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Anno
@MyAnno(s="abc",c=String.class,an=@Anno,co=Color.RED,arr= {"abc","bca","cba"})
public class MyAnnoDemo {

}
//定义一个无属性的注解
@Retention(RetentionPolicy.RUNTIME)    //元注解
@interface Anno{
    
}
enum Color{
    RED,BLUE,BLACK,YELLO;
}
//定义一个带有属性的注解
@Retention(RetentionPolicy.RUNTIME)    //元注解
@interface MyAnno{
    boolean b() default false;    //定义基本数据类型的属性
    String s();    //定义字符串数据类型的属性
    Class c();    //定义Class类型的属性
    Anno an();    //定义注解类型的属性
    Color co();    //定义Color枚举的属性
    String[] arr();    //定义一个String一维数组的属性
}

注解存在的阶段:

  源码阶段(默认)
  编译阶段
  运行阶段

元注解:只用于修饰其他注解。

自定义注解默认存在于源码阶段,需要让注解存在的时间更长,使用元注解。
  @Retention(RetentionPolicy.SOURCE);//被修饰的注解保存于源码阶段
  @Retention(RetentionPolicy.CLASS);//被修饰的注解保存于编译阶段
  @Retention(RetentionPolicy.RUNTIME);//被修饰的注解保存于运行阶段
    注意:RetentionPolicy是enum枚举类型。

注解配合反射实现指定的功能:

1.编写注解
2.编写自定义类
3.编写核心运行类

eg:

public class CoreRunner {
    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        Class clazz = Demo.class;
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            //    isAnnotationPresent() 判断该method对象上面是否被指定的注解修饰
            if (method.isAnnotationPresent(Anno.class)) {
                method.invoke(clazz.newInstance(), null);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/laodang/p/9541187.html