【Java-------注解 Annotation】

使用注解格式

注解的格式,通常情况下使用@符号开始,后面跟上对应的注解名称,以及注解参数和对应的值。
@注解名称([{ 标识符 = 元素的值, 
标识符 = {元素的值, 元素的值, 元素的值},
 标识符 = Annotation 
 }])

定义注解格式

修饰符 @interface 注解名称{
 [注解的方法参数] 
 }

以及 API 的描述,对于注解的实现。通常分为三种,第一种是最通用的。其他的都是第一种的简写
方式。

  1. 标准的注解( NormalAnnotation )举例: @TypeName(value=ElementValue)
  2. 标记注解( MarkerAnnotation ) 举例:@TypeName
  3. 单元素注解( SingleElementAnnotation ) 举例:@TypeName(ElementValue)

Annotation 接口

在 Java 中,Annotation 接口是所有元注解接口扩展的通用接口。所有的注解都隐式的扩展自该接
口。但是需要注意的,继承和实现该接口并不能实现定义注解接口。并且该接口并没有定义成一个注解
接口。

public interface Annotation

在这里插入图片描述
对于 java.lang.annotation 包中, 元注解接口有以下类:
在这里插入图片描述
在这里插入图片描述

内置注解

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:
内置注解:@Override @Deprecated @SuppressWarnings @FunctionalInterface @SafeVarargs
在这里插入图片描述
在这里插入图片描述

元注解

@Documented -- @Documented 所标注内容,可以出现在javadoc中。
@Inherited -- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有 继承性。
@Retention -- @Retention只能被用来标注“Annotation类型”,而且它被用来指定 AnnotationRetentionPolicy属性。 
@Target -- @Target只能被用来标注“Annotation类型”,而且它被用来指定AnnotationElementType属性。

在这里插入图片描述
在这里插入图片描述

@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以 通过反射访问。 
@Documented - 标记这些注解是否包含在用户文档中出现(javadoc)@Target - 标记这个注解应该是哪种 Java 成员。 
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) 
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

自定义注解

示例:


//AnnotationTest.class
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

@Ann(name = "李四", value = 18, sex = "男")
public class AnnotationTest {
    @Ann(name = "李强", value = 88)
    public static void main(String[] args) throws NoSuchMethodException {
        var me = AnnotationTest.class;
        var m = me.getMethod("main", String[].class).getAnnotation(Ann.class);
        System.out.println(m);
        System.out.println(m.sex());
        System.out.println(m.name());
        System.out.println(m.value());
        if (me.isAnnotationPresent(Ann.class)) {
            var an = (Ann) me.getAnnotation(Ann.class);
            System.out.println(an.sex());
            System.out.println(an.value());
            System.out.println(an.name());
        }
    }
}


/* TYPE是类上 METHOD是方法 */
@Retention(RUNTIME)
@Target({TYPE, METHOD})
@interface Ann {
    String name();

    int value();

    String sex() default "女";
}


//自定义Anns注解
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Retention(RUNTIME)
@Target({TYPE, METHOD})
@interface Anns {
    Ann[] value();
}


//自定义Ann注解
@Repeatable(Anns.class)
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Ann {
    String name();

    int age() default 18;

    String sex() default "男";
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值