注解

一、注解概述(Annotation)

1.1 注解是什么

​ 注解就是代码里的特殊标记,这些标记可以在编译类加载运行时被读取,并执行相应的处理。通过注解,程序员可以在不改变原有代码逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

​ 注解可以用来修饰包、类、构造器、方法、成员变量、参数、局部变量的声明

1.2 用途

​ 1、JavaSE:标记重写、标记过时的功能、忽略警告等。

​ 2、JavaEE:配置应用程序的任何切面,代替 xml 配置等。

​ 3、框架 = 注解 + 反射 + 设计模式

二、JDK 中三个基本注解的使用

2.1 @Override

​ 限定重写父类方法 , 该注解只能用于修饰方法

2.2 @Deprecated

​ 用于表示所修饰的元素 (类, 方法等 )已过 时。通常是因为 所修饰的结构危险或存在更好选择

2.3 @SuppressWarning

​ 抑制编译器警告

public class AnnotationTest {
    @Override
    public String toString() {
        return "重写的 toString() 方法";
    }
    
    @SuppressWarnings("unused")
    public void unusedFun() {
        System.out.println("未被使用的方法");
        @SuppressWarnings("unused")
        String val = "未被使用的变量";        
    }
    
    @Deprecated
    public void print() {
        System.out.println("过时的方法");
    }
}

三、自定义注解(必须结合反射才有用)

​ 自定义注解参考 @SuppressWarnings 和 @Override 即可

​ 1、用 @interface 来声明一个注解

​ 2、定义成员(如果不定义成员,那么注解只用来做标记,如 @Override)

注意:注解的成员是函数,在使用起来像是属性。

​ 3、可设置成员的默认值

例:

public class MyAnnotationTest {

    @MyAnnotation
    public void defaultAnnotation() throws NoSuchMethodException {
        Class<MyAnnotationTest> clazz = MyAnnotationTest.class;
        //通过反射获得 MyAnnotationTest 的 defaultAnnotation 方法, 再获得该方法的注解
        Annotation a = clazz.getDeclaredMethod("defaultAnnotation").getAnnotation(MyAnnotation.class);
        MyAnnotation m = (MyAnnotation) a;
        String value = m.value();
        System.out.println(value);
    }

    @MyAnnotation(value = "非默认注解")
    public void undefaultAnnotation() throws NoSuchMethodException {
        Class<MyAnnotationTest> clazz = MyAnnotationTest.class;
        //通过反射获得 MyAnnotationTest 的 undefaultAnnotation 方法, 再获得该方法的注解
        Annotation a = clazz.getDeclaredMethod("undefaultAnnotation"). getAnnotation(MyAnnotation.class);
        MyAnnotation m = (MyAnnotation) a;
        String value = m.value();
        System.out.println(value);
    }

    public static void main(String[] args) throws NoSuchMethodException {
        MyAnnotationTest myAnnotationTest = new MyAnnotationTest();
        myAnnotationTest.defaultAnnotation();
        myAnnotationTest.undefaultAnnotation();
    }
}

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "默认注解";
}

四、JDK 中四个基本的元注解

元注解:用来修饰其他注解的注解。

4.1 @Retention

​ @Retention 用于修饰注解的生命周期,@Retention 中包含有一个 RetentionPolicy 类型的成员变量,使用 @Retention 时必须为该成员变量指定值:

​ @RetentionPolicy.SOURCE:在源文件中有效,编译期间被丢弃

​ @RetentionPolicy.CLASS:编译期间有效,会被保存到 .class 文件中,运行期间被丢掉

​ @RentationPolicy.RUNTIME:运行时有效,程序可以通过反射来获得该注解。(如果把上述示例中的 @Retention 删除,程序会报空指针异常。)

4.2 @Target

​ 用于修饰注解的修饰范围(包、类、函数、局部变量等)

在这里插入图片描述

4.3 @Documented

​ 被它修饰的注解将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的。

4.4 @Inherited

-4ZX3Y9rr-1587304710467)]

4.3 @Documented

​ 被它修饰的注解将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的。

4.4 @Inherited

​ 被它修饰的注解将具有继承性,如果某个类用了被它修饰的注解,那么该类的子类也自动获得该注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值