概念与测试

package com.day10.test;

import org.junit.Test;

import java.lang.annotation.Annotation;

/**
 * Author: Json
 * Date: 2021/9/9
 **/
public class TestJson {
    public static void main(String[] args) {
        System.out.println("新的开始");

        //注解
        //Annotation 用来修饰包 修饰类 构造器 方法 成员变量 参数 局部变量的声明
        // 这些信息被保存在Annotation的name='value'对中

        //在未来的开发模式 都是基于注解的
        // 框架 = 注解 + 反射  + 设计模式

        //注解的说明
        // @author 表明开发的作者
        // @version 表明该类模块的版本
        // @see 参数转向 也就是相关主题
        // @since  从哪个版本开始增加的
        // @param  对方法种的参数说明
        // @return 对方法的返回值的说明
        // @exception 异常的说明


        //编译时进行格式检查
        // @Override 重写父类方法 该注解用于方法
        // @Deprecated 用于表示所修饰的元素(类 方法等)已过时
        // @SuppressWarnings 抑制编译警告


        // 如何自定义注解
        //参照 @SuppressWarnings 就可以
        // 注解声明为 @interface
        // 内部定义成员  通常使用value 表示
        // 默认值 default 定义
        // 如果 自定义注解没有成员 表明是一个标识作用 比如 @Override
        //如果注解有成员 使用时 必须指定成员的值
        //一般自定义注解通常会指明两个元注解 : @Target() @Retention()

        // 注解的意义 配合反射的作用 可以做一些自己想做的事
        // 后续 学习 有讲到


        //jdk提供的 4种元注解
        // 元注解 对现有的注解进行解释说明的注解
        // @Retention()   声明注解的生命周期  : SOURCE\ CLASS (默认行为)\RUNTIME (只有声明为RUNTIME的注解,才能通过反射获取)
        // @Target()     用于指定被修饰的注解 能用于修饰那些程序元素 比如 (类,方法 接口)
        //@Target(ElementType.TYPE)——接口、类、枚举、注解
        //@Target(ElementType.FIELD)——字段、枚举的常量
        //@Target(ElementType.METHOD)——方法
        //@Target(ElementType.PARAMETER)——方法参数
        //@Target(ElementType.CONSTRUCTOR) ——构造函数
        //@Target(ElementType.LOCAL_VARIABLE)——局部变量
        //@Target(ElementType.ANNOTATION_TYPE)——注解
        //@Target(ElementType.PACKAGE)——包

        //一般自定义注解通常会指明两个元注解 : @Target() @Retention()

        // @Documented()   表示所修饰的注解 被javadoc 解析时 保留下来  提取成文档
        // @Inherited()   被他所修饰的注解 具有继承性

        //通过反射 获取注解信息 --- 到反射的内容 再具体的学习


    }

    @Test
    public void testGetMyAnn(){ 
       //反射
        Class<Student> studentClass = Student.class;
        Annotation[] annotations = studentClass.getAnnotations();
        for (int i=0;i<annotations.length;i++){
            System.out.println(annotations[i]);
        }

    }


}



自定义注解

package com.day10.test;

import java.lang.annotation.*;

/**
 * Author: Json
 * Date: 2021/9/14
 * 声明注解
 **/
//声明注解生命周期   : SOURCE\ CLASS (默认行为)\RUNTIME (只有声明为RUNTIME的注解,才能通过反射获取)
@Retention(RetentionPolicy.RUNTIME)
//@Target(ElementType.TYPE)——接口、类、枚举、注解
//@Target(ElementType.FIELD)——字段、枚举的常量
//@Target(ElementType.METHOD)——方法
//@Target(ElementType.PARAMETER)——方法参数
//@Target(ElementType.CONSTRUCTOR) ——构造函数
//@Target(ElementType.LOCAL_VARIABLE)——局部变量
//@Target(ElementType.ANNOTATION_TYPE)——注解
//@Target(ElementType.PACKAGE)——包
@Target({ElementType.TYPE})  //指定myAnn 这个注解 可以使用在哪些程序上
@Inherited
public @interface myAnn {
    // 成员变量在 注解 定义中以无参数方法的形式来声明
    // 其方法名和返回值定义了该成员的名字和类型 我们称配置参数
    // 类型只能为八种基础数据类型 String Class enum Annotation  等
    // 可以声明初始值  使用 default 关键字
    //如果只有一个参数成员 建议使用 参数名value

    //一般自定义注解通常会指明两个元注解 : @Target() @Retention()

    String value() default "word";



}
//注解的使用

package com.day10.test;

/**
 * Author: Json
 * Date: 2021/9/10
 **/

//自定义注解
@myAnn(value = "hello")
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
         = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void walk() {
        System.out.println("人走路");
    }

    public void eat() {
        System.out.println("人吃饭");
    }
}

interface Info {
    void show();
}


class Student extends Person implements Info {

    @Override   //重写注解
    public void walk() {
        //super.walk();
        System.out.println("学生走路");
    }

    @Override  //重写注解  接口里的方法
    public void show() {

    }
}