Java自定义注解

Java注解

什么是Java的注解?

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

作用分类:
①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JDK中预定义的一些注解
 @Override	:表示被该注解标注的方法继承自父类(接口)
 @Deprecated:表示该注解标志的内容已经过时,不推荐使用
 @SuppressWarnings:去除警告
	一般传递参数all  @SuppressWarnings("all")
自定义注解
	元注解
	public @interface 注解名称{
		属性列表;
	}

javac Anno1.java

javap Anno1.class
Compiled from “Anno1.java”
public interface Anno1 extends java.lang.annotation.Annotation {
}

通过对一个空属性列表的Anno1注解进行编译和反编译后,得到:

public interface Anno1 extends java.lang.annotation.Annotation {
}

可见注解本质上就是一个接口,该接口默认继承Annotation接口

作为接口,注解里可以有抽象方法,这些方法称为注解的属性

属性的返回值类型有下列取值:

  • ​ 基本数据类型

  • ​ String

  • ​ 枚举

  • ​ 注解

  • ​ 由上述四种类型构成的数组

    测试 定义一个注解Anno1,使用五种返回值类型方法

public @interface Anno1 {
    int age();

    String name() default "无名";

    Hobby hobby();

    Anno2 anno();

    String[] strs();

}

定义一个实体类Student使用该注解的属性

@Anno1(age=18,hobby = Hobby.dangce,anno = @Anno2,strs={"str111","str222","str333"})
public class Student {

}

定义了属性,在使用时需要给属性赋值

1.如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

元注解

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

	* @Target:描述注解能够作用的位置
		* ElementType取值:
			* TYPE:可以作用于类上
			* METHOD:可以作用于方法上
			* FIELD:可以作用于成员变量上
	* @Retention:描述注解被保留的阶段
		* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
	* @Documented:描述注解是否被抽取到api文档中
	* @Inherited:描述注解是否被子类继承

那么可以注解后,注解的属性值如何使用呢?

注解的解析:
  1. 获取注解定义的位置的对象 (Class,Method, Field
  2. 获取指定的注解
  3. 调用注解中的抽象方法获取配置的属性值
public class Test {
    public static void main(String[] args) {
        Class stuCls = Student.class;
        Anno1 anno = (Anno1) stuCls.getAnnotation(Anno1.class);
        System.out.println(anno);
        int age = anno.age();
        String name = anno.name();
        Hobby hobby = anno.hobby();
        String[] strs = anno.strs();
        Anno2 anno1 = anno.anno();
        System.out.println("age="+age+",name="+name+",hobby="+hobby+",anno1="+anno1+",strs="+ Arrays.toString(strs));
    }
}

输出结果:

@com.codesy.annotation.Anno1(name=无名, age=18, hobby=dangce, anno=@com.codesy.annotation.Anno2(), strs=[str111, str222, str333])

age=18,name=无名,hobby=dangce,anno1=@com.codesy.annotation.Anno2(),strs=[str111, str222, str333]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值