Java高级篇——注解

SepLibraH 2024-8-24 550 8/24

Java高级部分——注解

概念:

注释——用文字描述程序的——给程序员看的,计算机执行时直接忽略注释;

注解——说明程序的——给计算机看的,JDK1.5之后提供的新特性;

作用:

1.编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】——API文档;

2.代码分析:通过代码里标识的元数据对代码进行分析【使用反射】——重点使用的功能;

3.编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查——@Override

JDK内置注解:
@Override:

检查被该注解标注的方法是否为继承自父类(接口)的,即是否为父类(接口)重写的方法;

系统会自动检查,若编写的方法与父类构造不同,就会报错提醒;

@Deprecated:

该注解标注的内容已过时,一个建议注解;

当有新方法优化了旧方法,但是为了此程序兼容低版本,不能删除旧方法,则可使用该注解标注旧方法表示已过时;

@SuppressWarnings():

压制警告

形式:@SuppressWarnings("all")——一般传递参数all

放在类上面,将消除该类的所有警告;放在某个方法上面,仅消除该方法的所有警告

自定义注解:
格式:
元注解
public @interface 自定义注解名{
    类型 属性1();
    类型 属性2() default "默认值";
}
本质:
//本质就是一个接口——默认继承Annotation接口:
public interface 自定义注解名 extends java.lang.annotation.Annotation{}
属性定义:

注解的属性:接口中可以定义的抽象方法

解释:

在自定义注解中定义的方法,使用时类似于属性,因此在注解中的方法称为属性;

在定义属性时尽可能命名像传统意义的属性名一样;

定义要求:

1.属性的返回值类型:基本数据类型、String、枚举、注解、前面类型的数组;

ps:不能使用void方法、自定义类型!!!

2.定义之后,在使用时,要给其赋值;

@自定义注解(属性1= ,属性2= )
//定义属性时设置default值,则使用时可不赋值;
//若只有属性需要赋值,并属性名为value,则value可省略;
//数组赋值时,只使用{};若数组中只有一个值{}可省略;
元注解:

JDK中已定义的注解——用于描述注解的注解;

@Target:被描述的注解作用的位置;

@Target(value={ElementType.})
/*
可取的值:
  TYPE:作用在类上
  METHOD:作用在方法上
  FIELD:作用在成员变量上
*/

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

@Retention(value={RetentionPolicy.})
/*
可取的值:
  SOURCE:当前被描述的注解,不会被编译
  CLASS:当前被描述的注解,会保留到class字节码文件中——会被编译
  RUNTIME:当前被描述的注解,会保留到class字节码文件中,被JVM会读取——自定义注解常用的值
*/

@Documented:被描述的注解是否被抽取到API文档中;

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

ps:一个类上使用了注解,该注解定义时也有@Inherited,则该类的子类会自动继承该注解;

解析注解:

在程序中使用(解析)注解——获取注解中定义的属性值;

使用场景:

注解大多数使用情况都是用来替换配置文件的,简化书写;

步骤:

1.获取注解定义的位置的对象(Class、Method、Field)

2.获取指定的注解:注解名 变量名 = getAnnotation(注解名.class)

3.调用注解中的抽象方法获取属性值:变量名.抽象方法()

/**
 * @author SepLibraH
 * @data 2024/8/14
 * 通过自定义注解实现反射,调用其他类和其方法——用来替换配置文件
 **/
@Pro(className = "java_base.java_pro",methodName = "show")
public class reflect {
    public static void main(String[] args) throws Exception{
        //获取该类的字节码文件对象
        Class<reflect> reflectClass = reflect.class;
        //获取上面Pro的注解对象
        //在内存中继承了自定义的Pro注解,并重写了其中的属性,属性值为调用Pro时传入的参数;
        Pro an = reflectClass.getAnnotation(Pro.class);
        // 调用重写的Pro中属性,获取返回值
        String className = an.className();
        String methodName = an.methodName();

        //打印测试
        System.out.println(className+"和"+methodName);
    }
}
案例:
简单的测试框架:

在java_lesson项目下的java_pro/annotation/anli中

- THE END -

SepLibraH

8月24日15:41

最后修改:2024年8月24日
4

非特殊说明,本博所有文章均为博主原创。