Java开发那些事

Java基础(二)-注解

2019-10-23  本文已影响0人  Stan_Z
一、注解定义

Java提供的一种源程序中的元素关联任何信息和任何元数据的途径和方法。我把它简单理解为一个标签。
Java SE5.0版本引入该概念。

二、注解介绍

1.JDK注解介绍

注解名 说明
@Override 重写
@Deprecated 过时
@SuppressWarnings(“”) 忽略警告

2.注解语法:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description { 
    String desc();
  
    int age() default 18;
}

3.类定义
使用@interface关键字定义注解

4.成员变量规范

5.元注解说明

注解名 作用域 说明
@Target ElementType.ANNOTATION_TYPE 给一个注解进行注解
ElementType.CONSTRUCTOR 构造方法
ElementType.FIELD 属性
ElementType.LOCAL_VARIABLE 局部变量
ElementType.METHOD 方法
ElementType.PACKAGE 包
ElementType.PARAMETER 方法参数
ElementType.TYPE 类、接口、枚举
限制的运行场景,可以多选,以”,”分隔。
@Retention RetentionPolicy.SOURCE 只在源码显示,编译时丢弃
RetentionPolicy.CLASS 编译时记录到class中,运行时丢弃
RetentionPolicy.RUNTIME 运行时存在,可反射读取
生命周期
@Inherited 允许子类继承
@Documented 生成javadoc时会包含注解

6.注解使用

@注解名(成员名1=“成员值1”,成员名2=“成员值2”,...)
@Description(desc = “class annotation")
public class MyClass {
}

7.注解解析
通过反射获取类、函数或成员上的运行时注解信息,实现动态控制程序运行逻辑。

try {
    Class clz = Class.forName("XXX");
    /**
     * 获取类上注解
     */
    //类上是否存在该注解
    boolean isExit = clz.isAnnotationPresent(Description.class);
    if (isExit) {
        //获取注解实例
        Description desc = (Description) clz.getAnnotation(Description.class);
        System.out.println(desc.value());
    }
    /**
     * 获取方法上注解
     */
    Method[] methods = clz.getMethods();
    for (Method method : methods) {
        boolean isMethodExit = method.isAnnotationPresent(Description.class);
        if (isMethodExit) {
            Description desc = (Description) method.getAnnotation(Description.class);
            System.out.println(desc.value());
        }
    }
    //or
    for (Method method : methods) {
        Annotation[] annotations = method.getAnnotations();
        for (Annotation ann : annotations) {
            if(ann instanceof Description){
                Description d = (Description) ann;
                System.out.println(d.value());
            }
        }
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
上一篇下一篇

猜你喜欢

热点阅读