JAVA注解(Annotation,@interface)复习

注解

JAVA注解(Annotation)是JDK5引入的一种注释机制,可用于类、方法、字段、参数、包上。虽然是注释机制,但不同于注释的是注解可以被嵌入到字节码当中,从而让我们可以在运行时获取到注解,也就是说可以通过反射来获取注解中的内容。

内置注解

JAVA中是有几个内置注解的,像我们最常见的@Override,@Deprecated。下面详细列举一下内置注解。

  • @Override:这个注解应该都不陌生,就是检查本方法是否是重写方法的。
  • @Deprecated:这个在源码中比较常见,标记方法过时用的。
  • @SuppressWarnings:让编译器忽略注解中的警告。
  • @FunctionalInterface:标注一个函数式接口。(jdk8的新特性)

下面几个是元注解,也就是用在注解上的注解。

  • @Retention:声明注解作用的生命周期,只保留在源文件 -> 保留在class中 -> 内存中的字节码。如果想在运行时通过反射获取内容,那肯定是要保留在字节码中的。
  • @Document:标注该注解是否包含在用户文档中。
  • @Target:声明该注解的作用域,是在类上,还是方法上等。
  • @Inherited:标注该注解继承自哪个注解(默认是没有继承的)。
  • @Repeatable:jdk8开始支持的,标识一个注解可以在同一个声明上使用多次。

注解的定义

定义注解还是比较简单的,只需要声明注解名称,注解内的属性值,以及加上几个必要的元注解即可。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)		// 一般这两个元注解是必须要有的
public @interface Test{					// 这里声明了一个名为Test的注解
    String value() default "";			// 声明了该注解有个一String类型的value属性,默认值为""(注意value后有括号)
}

这里要说两个枚举类:Target中的值是ElementType中的值,Retention中的值是RetentionPolicy中的值。

public enum ElementType {	// 定义作用域
    TYPE,               	// 作用在类、接口(包括注释类型)或枚举上

    FIELD,              	// 作用在字段声明(包括枚举常量)上

    METHOD,             	// 作用在方法上

    PARAMETER,          	// 作用在方法形参上

    CONSTRUCTOR,        	// 作用在构造方法上

    LOCAL_VARIABLE,     	// 作用在局部变量上

    ANNOTATION_TYPE,    	// 作用在注解上

    PACKAGE             	// 作用在包上
}

public enum RetentionPolicy {	// 定义声明周期
    SOURCE,            			// 仅存在于源码中,也就是说编译器处理完之后就没有了

    CLASS,             			// 存在于.class文件中。也是默认行为

    RUNTIME            			// 存储于class文件中,并存在于运行时
}

注解的使用

使用注解就是一件很简单的事情了,用过SpringBoot的应该都很熟练了。需要注意的是,如果注解中只对value赋值的话,可以省略value。其他情况都不能简写。

@Test(value="hello world")	// 这里可以省略value,写法是@Test("hello world")
public class TestMyAnnotation{
    
}

注解获取

要注意只有@Retention(RetentionPolicy.RUNTIME),定义生命周期为运行时才可以通过反射获取注解内容。

public void getAnnotation(){
    TestMyAnnotation test = new TestMyAnnotation();
    boolean isAnnotationByTest = test.getClass().isAnnotationPresent(Test.class);	// 判断该类上是否被Test注解标注
    if(isAnnotationByTest){
        Test anno = test.getClass().getAnnotation(Test.class);		// 获取类上标注的注解
        String value = anno.value();			//获取到注解中的value值,也就是"hello world"
    }
}

这个是获取类上注解的代码,获取方法,字段,参数上的注解也都是类似的。获取参数的会稍微有些变化,会返回一个Annotation[][]需要对这个返回值进行遍历。


总结

总的来说注解是不难学习的,实际上我们更多是使用注解,十分方便。注解的定义需要注意的就是声明周期的定义以及作用域的定义,越小越好;获取注解要分两步:先判断是否有该注解,然后才能去获取该注解。合理的利用注解能大大提高我们的开发效率,SpringBoot就使用注解大大减轻了程序员的代码量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值