java注解

目录

 

1、什么是注解,注解的定义

1.1  相关概念

1.2 注解的本质

2、有什么用

3、注解由哪些元素组成

3.1  元注解

3.1.1 @Retention     注解保留在哪一阶段,会在哪一阶段起作用。

3.1.2 @Target   注解的作用目标

3.1.3 @Document  文档注解  

3.1.4 @Inherited     继承

3.1.5 @Repeatable


部分内容摘抄自https://www.jianshu.com/p/9471d6bcf4cf

 

1、什么是注解,注解的定义

1.1  相关概念

Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。

日常开发中新建Java类,我们使用class、interface比较多,而注解和它们一样,也是一种类的类型,他是用的修饰符为 @interface。

1.2 注解的本质

/**Annotation接口源码*/

public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    Class<? extends Annotation> annotationType();

}

注解的本质就是接口

 

2、有什么用

  • 提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
  • 编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
  • 运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。
  • 正如官方文档的那句话所说,注解能够提供元数据,转账例子中处理获取注解值的过程是我们开发者直接写的注解提取逻辑,处理提取和处理 Annotation 的代码统称为 APT(Annotation Processing Tool)。上面转账例子中的processAnnotationMoney方法就可以理解为APT工具类。

 

3、注解由哪些元素组成

3.1  元注解

3.1.1 @Retention     注解保留在哪一阶段,会在哪一阶段起作用。

如下:

  source    源码级

  class   类加载级

 running  jvm运行期间   通过反射获取

 

3.1.2 @Target   注解的作用目标

 

  • @Target(ElementType.TYPE) 作用接口、类、枚举、注解
  • @Target(ElementType.FIELD) 作用属性字段、枚举的常量
  • @Target(ElementType.METHOD) 作用方法
  • @Target(ElementType.PARAMETER) 作用方法参数
  • @Target(ElementType.CONSTRUCTOR) 作用构造函数
  • @Target(ElementType.LOCAL_VARIABLE)作用局部变量
  • @Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
  • @Target(ElementType.PACKAGE) 作用于包
  • @Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
  • @Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)

 

3.1.3 @Document  文档注解  

被作用于@Document的注解在javadoc命令执行后可以展现注解中的元素及注解本身

 

3.1.4 @Inherited     继承

如果一个类被标记为继承注解所注解的注解,那么他的子类也会拥有该注解

 

3.1.5 @Repeatable

被这个元注解修饰的注解可以作用同一个对象很多次

 

 

3.2 注解常用方法

 

/**是否存在对应 Annotation 对象*/

  public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {

        return GenericDeclaration.super.isAnnotationPresent(annotationClass);

    }

 

 /**获取 Annotation 对象*/

    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {

        Objects.requireNonNull(annotationClass);

 

        return (A) annotationData().annotations.get(annotationClass);

    }

 /**获取所有 Annotation 对象数组*/  

 public Annotation[] getAnnotations() {

        return AnnotationParser.toArray(annotationData().annotations);

    }   

 

 

 

3.3 注解属性类型

1.基本数据类型

2.String

3.枚举类型

4.注解类型

5.Class类型

6.以上类型的一维数组类型

 

3.4 注解成员变量赋值

  • 如果注解又多个属性,则可以在注解括号中用“,”号隔开分别给对应的属性赋值,如下例子,注解在父类中赋值属性

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTestAnnotation {
    String name() default "mao";
    int age() default 18;
}

@MyTestAnnotation(name = "father",age = 50)
public class Father {
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄智力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值