Java基础强化(二) -- 注解

Java基础强化(二) – 注解

一、注解概述

1.定义

​ 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

2.作用描述

​ (1)编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查[@Override]

​ (2)编写文档:通过代码里的标识的注解生成doc文档

​ (3)代码分析:通过代码里标识的注解对代码进行分析[使用反射]

3.JDK中预定义的注解

​ **@Override:**检测被改注释标注的方法是否是继承自父类(接口)的

​ **@Deprecated:**该注解标注的内容,标识已过时。即虽然可以使用,但是不推荐使用

​ **@SuppressWarnings:**压制警告

​ *一般传递参数all,@SuppressWarnings(“all”)

二、自定义注解

1.格式

元注解
public @interface 注解名称{
    属性列表;
}

2.本质

​ 注解本质是一个接口,该接口默认继承Annotation接口

>
>
>假设按照上述1.格式自定义一个接口My Anno,并通过反编译的方式,我们会得到一下结果
>
>public interface MyAnno extends java.lang.annotation.Annotation{}

3.属性:接口中的方法

​ 要求:

​ (1)属性的返回值有一下列取值

  • 基本数据类型
  • String
  • 枚举
  • 注解
  • 上述类型的数组

public @interface MyAnno{
    int show1 ();
    String show2();
    Person show3() default "Person.p1";
    @Override show4();
    String[] show5();
}

​ (2)定义了属性,在使用时需要给属性赋值

​ (a)如果定义属性时,使用default 关键字给属性默认初始化,则使用注解时,可以不进行属性的赋值

​ (b)如果只有一个属性需要赋值,且这个属性名称是value,则“value=”可以省略,直接定义值即可

​ (c)数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

@MyAnno(show1=1,show2="hello",show4=@Override,show5={"abc","bcd"})
public class show{
    
}

4.元注解:用于描述注解的注解

​ 常用的元注解有四个:

  • @Target : 描述注解能够作用的位置

​ ElementType的取值:

  	* Type:表示注解可以作用于类上 
  	* Method:表示注解可以作用于方法上
  	* Field:表示注解可以作用于成员变量上
  • @Retention:描述注解被保留的阶段

  • @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到

  • @Documented:描述注解是否被抽取到API文档中

  • @Inherited:描述注解是否被子类继承

5.程序中对注解的解析

​ 在程序中使用(解析)注解,获取注解中定义的属性值

​ (1)获取被注解的对象(类,方法,成员变量等)

​ (2)获取指定的注解

通过getAnnotation(class)方法

​ (3)调用注解中的抽象方法来获取配置的属性值

​ 示例程序:

​ 首先定义一个Prop注解,有两个属性:className用来存储类名,methodName用来存储方法名

@Target("ElementType.Type")
@Retention(RetentionPolicy.RUNTIME)
public @interface Prop{
    String className();
    String methodName() ;
}

​ 则我们可以按如下方式使用并调用注解中的属性。

@Prop(className="cn.itcast.annotation.Demo1",methodName="show")
public class ReflectTest	{
    public static void main (String [] args) throws Exception{
        //获取被注解的类字节码文件
        Class<ReflectTest> reflectTestClass = ReflectTest.class ;
        //获取类上的注解对象
        Prop prop = reflectTestClass.getAnnotation(Prop.class);
    	//调用注解对象中定义的抽象方法,获取属性
        String className = prop.className();
        String methodName = prop.methodName();
    }
}

​ 对于以上程序调用我们可以理解成Java为我们自动生成了一个如下的Prop实现类:

public class PropImpl implments Prop{
    public String className(){
        return "cn.itcast.annotation.Demo1";
    }
    public String methodName(){
        return "show" ;
    }
} 
发布了14 篇原创文章 · 获赞 0 · 访问量 150

猜你喜欢

转载自blog.csdn.net/weixin_44580146/article/details/104404874