Java注解

人生之路坎坎坷坷,跌跌撞撞在所难免。但是,不论跌了多少次,你都必须坚强勇敢地站起来。任何时候,无论你面临着生命的何等困惑抑或经受着多少挫折,无论道路多艰难,希望变得如何渺茫,请你不要绝望,再试一次,坚持到底,成功终将属于勇不言败的你。

导读:本篇文章讲解 Java注解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

作为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);
    }

}

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

参考 参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/133785.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!