注解和反射机制

本文介绍了Java注解的基本概念,包括其与注释的区别,以及注解的类型如内置注解(@Override,@Deprecated,@SuppressWarnings)和元注解(@Target,@Retention,@Documented,@Inherited)。此外,文章详细阐述了如何自定义注解,包括无参数、单参数、多参数及带默认值的注解,并给出了使用示例。最后,讨论了注解的用途和生命周期。
摘要由CSDN通过智能技术生成

一、注解

1.什么是注解?

                 注解:解释给机器看的   注释:解释给人看的      

1.1注解的含义

1.Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制。

2.Java语言当中的类、方法、变量、参数和包等都可以被标注。和javadoc不同,java注解可以通过反射获取注解的内容。

3.注解的生命周期:在编译器生成class文件时,注解可以被嵌入到字节码当中。java虚拟机jvm可以保留注解内容,在运行时候可以获取到注解内容。

4.支持自定义注解

1.2注解的类型

 1.2.1内置注解:作用在代码的注解有3个

  • @Override  -- 检查该方法是否重写。
  • @Deprecated -- 表示不鼓励程序员使用 通常是因为他很危险或者存在更好的选择 但是也是可以使用的
  • @SpressWarmings --用来抑制编译时的警告信息(指示编译器去忽略注解中声明的警告)。

                值得注意的是: 不同于上诉两个注解 这个注解是需要给定参数的。

                @SpressWarmings("all");

                 @SpressWarmings("unchecked");

                @SpressWarmings(value={"unchecked","deprecation"})。。。。。

 1.2.2   元注解

元注解的作用是负责注解其他注解

内容:

        @Target  --表示这个注解的目标是哪里 (被秒速的注解可以用在那些地方)

        @Retention --表示需要在什么级别保存 ,用于描述注解的生命周期  

                        (SOURCE>CLASS>RUNTIME)

        @Document -- 表示这些注解是否会被包含在javadoc文档当中

        @Inherited --表示这个注解是继承与那个注解类

1.3如何自定义注解

使用@interface 自定义注解 ,会自动继承了java.lang.annotation.Annotation接口

格式: public @ interface 注解名{

         注解参数: 参数类型 + 参数名 +  ();            

}

注意:虽然注解参数的格式像方法的格式 但是他是参数不是方法

1.3.1无参数的注解

//无参数的注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation01{
    
}

没有设置参数的注解 使用的时候也不用设置参数

1.3.2有一个参数的注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation02{
    String value();
}

设置一个参数的注解在使用时

1 参数名可以直接使用“value”

2可以不用输入”value=“,直接输入值就ok

1.3.3有多个参数类型的注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation03{
//注解参数: 参数类型 + 参数名 +()+;
    String name();
    int id ();
    String[] schools();
}

有设置多个参数的注解 在使用的时候注意

1 要输入参数类型 以及对应的值 

2 要完整的输入参数

3 可以不用注意顺序

 1.3.4有参数默认值的注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation04{
    String name() default "默认值";
    int id() default 3;
    String[] schools();
}

有默认值的参数可以不用输入,只需显示输入参数就可以

2.为什么要用注解?

 作用:1起检查和约束的作用2 简便代码

3.怎么使用注解?

3.1使用无参数的注解

@MyAnnotation01
    public static void testMyAnnotation01(){
        System.out.println("MyAnnotation01注解没有设置参数应用是不用填写参数");
    }

3.2使用有参数的注解

 @MyAnnotation02("2号")
    public static void testMyAnnotation02(){
        System.out.println("MyAnnotaion02注解值设置一个参数 参数名就用value设置 在应用时可以不用写”value=“直接写”value的值“ ");
    }

3.3使用有多个参数的注解

//2自定义注解时设置的参数就必须在应用时填写参数
    @MyAnnotation03(name="3号",schools = {"清华大学","北京大学"},id=18)
 public static void testMyAnnotation03){
        System.out.println("MyAnnotation03注解设置了参数 应用时就必须填写完整 且参数的顺序可以调换");
    }

3.4使用多个参数且设置默认值的注解

@MyAnnotation04(schools={"复旦大学","南京大学"},name="4号")
    public static void testMyAnnotation04(){
        System.out.println("MyAnnotation04注解参数当中设置了默认值 1有默认值在应用参数时可以不用填写参数值 ;2也可以显示的填写参数值 ;3但是没有设置参数值的一定要填写");
    }

4注解的架构

4.1Annotation 组成部分

java Annotation 的组成中,有 3 个非常重要的主干类:

1  Annotation.java

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

2 ElementType.java

package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

3 RetentionPolicy.java

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

说明:

(1)Annotation就是一个接口。

         每一个Annotation对象,都会有唯一PetentionPolicy属性,多个ElementType属性。

(2) ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型。

        "每 1 个 Annotation" 都与 "1~n 个 ElementType" 关联。

        当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。

(3) RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗点说,就是不同 RetentionPolicy 类型的 Annotation 的作用域不同。

        "每 1 个 Annotation" 都与 "1 个 RetentionPolicy" 关联。

  • 若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。
  • 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。
  •  若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于 class 文件中,并且可由JVM读入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值