Java注解(Annotation)机制

概念

Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象,然后通过该 Annotation 对象来获取注解中的元数据信息。

定义一个注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Person {
    //年龄
    public int age() default 10;
    //名字
    public String name() default "";
    //地址
    public String address() default "广东省广州市市";

}

4种标准的元注解

  1. @Target修饰的对象范围ElementType的类型
ElementType的类型修饰的对象
ElementType.TYPE接口、类、枚举、注解
ElementType.FIELD类中的属性之上
ElementType.METHOD作用在方法之上
ElementType.PARAMETER作用在方法的参数之上
ElementType.CONSTRUCTOR作用在构造方法之上
ElementType.LOCAL_VARIABLE作用在本地变量之上
ElementType.ANNOTATION_TYPEAnnotation类型
ElementType.PACKAGE作用在包之上
  1. @Retention 定义 被保留的时间长短

    Retention 定义了该 Annotation 被保留的时间长短:表示需要在什么级别保存注解信 息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),取 (RetentionPoicy)由:

  • SOURCE:在源文件中有效(即源文件保留),如Override注解
  • CLASS:在 class 文件中有效(即 class 保留),比如ButterKnife中BindView,OnClick注解
  • RUNTIME:在运行时有效(即运行时保留),比如Retrofit中的GET、POST等
  1. @Documented
    @ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以被例如 javadoc 此类的工具文档化。

  2. @Inherited阐述了某个被标注的类型是被继承的
    @Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该class 的子类。

注解处理(解析)

如上面的注解使用

public class AnnotionTest {
    @Person(name = "XiaoMing", age = 20, address = "ShangHai")
    private String person;

    public static void main(String[] args) {
        AnnotionTest annotionTest = new AnnotionTest();
        annotionTest.person = getPersonInfo(annotionTest.getClass());
        System.out.println(annotionTest.person);
    }
    //解析注解
    private static String getPersonInfo(Class<?> mClass){
        //获取所有的属性信息
        Field[] fields = mClass.getDeclaredFields();
        for (Field field : fields) {
            //找到Person注解(作用在参数之上)
            if (field.isAnnotationPresent(Person.class)){
                Person person = field.getAnnotation(Person.class);
                String name = person.name();
                int age = person.age();
                String address = person.address();
                System.out.println();
                return "name:"+name+",age:"+age+",address:"+address;
            }
        }
        return "";
    }

}

打印如下

name:XiaoMing,age:20,address:ShangHai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值