一、概念解释

1.什么是注解?

标准解释:java中的类、构造器、方法、成员变量、参数都可以被注解进行贴上标签。
直白理解:注解也可以理解为标签。对一个人的评价高矮胖瘦,好人坏人或者渣男老实人等,就是起到你给它贴上这个标签,但是这些标签又不会对他本人产生什么影响。因为那个标签只是你的看法

2.注解有什么作用?

答:就是为了方便对类中的信息进行标注注释,方便查看。不会对实际代码产生什么影响。

3.注解的分类?

(1)自定义注解

答:自己可以任意DIY定义的注解:比如给其他人打上你想打的任意标签信息

(2)元注解

答:注解的注解(就是标签上面再贴标签):对自定义的标签设置可以在哪里使用和能存活多久

常用的有两个:
@Target:约束自定义注解只能在哪些地方使用

//括号里面加入以下哪个,哪种类型就可以允许贴上这个标签

 类、接口----TYPE

成员变量----FIELD

成员方法----METHOD

方法参数----PARAMETER

构造器----CONSTRUCTOR

局部变量----LOCAL_VARIABLE

@Retention:申明注解的生命周期

只在源码阶段(用的比较少)-----SOURCE

源码、字节码阶段(默认)---CLASS

源码、字节码、运行阶段(开发常用)--RUNTIME

(3)注解解析

答:对已经被这个注解过的地方进行提取自定义的注解信息

提取被该注解的类就创建该类的信息,然后按照步骤提取。

提取被该注解的方法就创建该类的信息,然后按照步骤提取。

提取被该注解的属性就创建该类的信息,然后按照步骤提取。

二、实战案例分析

1.自定义注解

创建格式:

 public @interface 注解名称 {
       属性类型 属性名()defalt 默认值;
}

 创建步骤:

1.创建一个类(类名就是注解名称),把类中的class改为@interface。然后定义要贴上的标签数据 

//注解
package learn2;
public @interface  BadBoy {
     String name() default "坏男孩";//自定义标签值            这个default "坏男孩";----不写也可以,那就没有默认值了
     int age();//自定义标签值
     String value();//特殊标签值。(标签里面写上这个,被打上这个标签的属性,必须要有具体赋值。就像试吃食品,吃一个没事,吃多了就必须要给钱--赋值)
}

2.给需要的地方打上注解标签

//被测试的类
package learn2;
@BadBoy(name="汉奸",age = 45,value = "自定义")//在类上面建立就是类的注释
public class People {

    @BadBoy(name = "方法",age = 15,value = "自定义") //在方法上面建立就是方法的注释
    public static void main(String[] args) {

    @BadBoy(name = "成员属性",age = 19,value = "自定义")//在属性上面建立就是属性的注释
    String hobby="打篮球";

    @BadBoy(age = 19,value ="自定义")//在属性上面建立就是属性的注释
    String hobby1="跳舞";
    }
}

2.元注解

创建步骤:

1.在注解的上面创建@Target@Retention这两个常用的元注解,里面的参数根据不同需要填入,参数不懂的滑到上面概念解析那里看。 

//被测试的元注解
package learn2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//里面参数不懂的返回上面看概念解析
//元注解--表示可以在哪里贴上
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})
//元注解---表示一直在运行阶段
@Retention(RetentionPolicy.RUNTIME)
//自定义注解
public @interface  BadBoy {
     String name() default "坏男孩";
}

2.元注解限制了自定义标签给谁用和生命周期等 

//正常使用到的类
package learn2;
@BadBoy(name="汉奸")
public class People {
    @BadBoy(name = "方法")
    public static void main(String[] args) {
    @BadBoy(name = "爱好")
    String hobby="打篮球";
    }
}

 3.注解解析

解析类

创建步骤:

1.创建要解析的类对象

2.if用isAnnotationPresent判断这个类是否有注解,(注解.class)

3.用getDeclaredAnnotation方法直接获取,(注解.class)

4.打印需要该解析类里面的某个自定义属性

解析方法

创建步骤:

1.创建要解析的类对象

2.用getDeclaredMethod获取方法("要获取的方法名")

3.if用isAnnotationPresent判断这个类是否有注解,(注解.class)

4.用getDeclaredAnnotation方法直接获取,(注解.class)

5.打印需要该解析类里面的某个自定义属性

package learn2;
import java.lang.reflect.Method;
@BadBoy(name="我的名字就是类啊")
public class People {
    @BadBoy(name = "我的名字就是方法啊")
    public static void main(String[] args) throws NoSuchMethodException {
        
    //注解的解析
        //一、解析类步骤
        //1.解析这个类的对象
        Class p = People.class;
        //2.判断这个类是否有这个注解
        if (p.isAnnotationPresent(BadBoy.class)){
            //3.直接获取该注释对象
            BadBoy b = (BadBoy) p.getDeclaredAnnotation(BadBoy.class);//这里不用到万能键补全键,要手动进行强转
            //5.打印需要的值
            System.out.println(b.name());
        }

        //二、解析方法步骤
        //1.解析这个类的对象
        Class p2 = People.class;
        //2.获取要获取的方法
        Method m = p2.getDeclaredMethod("main", String[].class);
        //3.判断这个类是否有这个注解
        if (m.isAnnotationPresent(BadBoy.class)){
            //4.直接获取该注释对象
            BadBoy b2 = (BadBoy) m.getDeclaredAnnotation(BadBoy.class);//这里不用到万能键补全键,要手动进行强转
            //5.打印需要的值
            System.out.println(b2.name());
        }
    }
}

运行结果:

我的名字就是类啊
我的名字就是方法啊 

旁白:注解就是对类或者方法,属性什么的进行备注贴标签,在庞大的代码中能更快的寻找阅读代码,这些注解不会对实际代码产生什么影响,注解有自定义的,还有注解的注解,也就是元注解,还有可以对这些注解里面写入的内容进行解析读取出来。