Java注解

作为Java后端开发人员,每天都要看或写很多的@

在这里插入图片描述

比如 @Autowired等

"@"在Java中称为注解

什么是注解?
百度一下
在这里插入图片描述

注解:也叫元数据。一种代码级别的说明。他是JDK1.5及以后版本引入的一个特性,与类接口,枚举是在同一个层次。它可以声明在包,类,字段,方法,局部变量,方法参数等前面,用来对这些元素进行解释,说明。

如果第一次接触注解的你相信你现在一脸懵逼

个人理解:

注解就是标签。为包,类,方法,属性,等打的一个标签。
也可以把它理解为注释,只不过这个注释是给计算机看的不是给程序员看的。

为什么注解也叫元数据呢?
元数据:即描述数据的数据。

那么注解也即:描述程序的程序。

作用:

1,编写文档

2,编译检查

编写一个JavaDoc类

/**
 * @version 1.0
 * @Author:杨杰
 * @Date:2022/5/15 16:21
 */
public class JavaDoc {/**
     * 加法
     * @param a
     * @param b
     * @return 返回结果
     */
    public int add(int a,int b) {
        return a + b;
    }}

在这里插入图片描述

命令行打开当前目录

在这里插入图片描述

运行成功

在这里插入图片描述

双击index.html

在这里插入图片描述

这就是编写文档
什么又是编译检查呢?
举一个例子

我们经常重写ToString方法

 @Override
    public String toString() {
        return "Student{" +
                "id='" + userId + '\'' +
                ", username='" + username + '\'' +
                ", ustatus='" + ustatus + '\'' +
                ", money=" + money +
                '}';
    }

@Override注解就是标注该方法重写了父类的方法
如果不加获取写错Override那么就会报错,编译检查不通过

自定义注解

格式

public @interface 注解名称 {}

例如

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoReflect {String className();
    String methodName();
}

元注解

描述注解的注解

@Target:描述能够作用的位置

@Target(ElementType.TYPE)

ElementType取值

1,TYPE:可以作用在类上

2,METHOD:可以作用在方法上
3,FIELD:可以作用在成员变量上

@Retention:描述注解被保留的阶段

@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会被保留到字节码文件中,并被JVM读取到,一般直接定义的注解都加在RUNTIME

@Documented:描述该注解是否会被抽取到api文档中

@Inherited:描述注解是否被子类继承

来一个小案例

自定义AnnoReflect注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoReflect {String className();
    String methodName();
}
创建 AnnoTest1public class AnnoTest1 {
    public void play(){
        System.out.println("AnnoTest1 method play()");
    }

测试类

@AnnoReflect(className = "cn.itcast.annotion.AnnoTest1",methodName = "play")
public class ReflectAnnotationTest {


    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {


        /**
         * 前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法
         * 即:拒绝硬编码
         */
        //1. 解析注解
        //1.1 获取该类的字节码文件对象
        Class<ReflectAnnotationTest> rac = ReflectAnnotationTest.class;
        //1.2 获取上面的注解对象,其实就是在内存中生成了一个该注解接口的子类实现对象
        AnnoReflect an = rac.getAnnotation(AnnoReflect.class);
        /*
        相当于        public class AnnotationReflect implements AnnoReflect{
            public String className(){
                return "cn.other.annotation.AnnoTest1";
            }
            public String methodName(){
                return "play";
            }
        }
        */
        //2. 调用注解对象中定义的抽象方法,获取返回值
        String className = an.className();
        String methodName = an.methodName();
        //3.加载该类进内存
        Class cls = Class.forName(className);
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);
    }

}

注意​:注解的本质为接口​

参考 参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炸鸡叔老白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值