java注解详解

注解详解

一、基础知识

   注解用于对代码进行说明,主要对包、类、接口、字段、方法参数、局部变量等进行注解.

1.1 作用

  • 生成javadoc文档
  • 让编译器在编译期间进行检查验证
  • 编译时动态处理,例如动态生成代码
  • 运行时动态处理,例如使用反射注入实例

1.2 分类

  • Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
  • 元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented,@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。
  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

二、 Java内置注解

Java内置注解

  • @Override:表示当前的方法定义将覆盖父类中的方法
  • @Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告
  • @SuppressWarnings:表示关闭编译器警告信息

2.1 内置注解 - @Override

/**
 * 复写父类方法
 * 
 */
@Target(ElementType.METHOD) // 对象:方法
@Retention(RetentionPolicy.SOURCE) // 运行期间: 源文件
public @interface Override {
}

2.2 内置注解 - @Deprecated

@Documented // 生成JavaDoc
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

2.3 内置注解 - @SuppressWarnings

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

三、元注解

在这里插入图片描述

3.1 元注解 - @Target:描述注解的使用范围

范围枚举

public enum ElementType {
 
    TYPE, // 类、接口、枚举类
 
    FIELD, // 成员变量(包括:枚举常量)
 
    METHOD, // 成员方法
 
    PARAMETER, // 方法参数
 
    CONSTRUCTOR, // 构造方法
 
    LOCAL_VARIABLE, // 局部变量
 
    ANNOTATION_TYPE, // 注解类
 
    PACKAGE, // 可用于修饰:包
 
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
 
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
 
}

3.2 元注解 - @Retention & @RetentionTarget:描述注解保留的时间范围

范围:

public enum RetentionPolicy {
 
    SOURCE,    // 源文件保留
    CLASS,       // 编译期保留,默认值
    RUNTIME   // 运行期保留,可通过反射去获取注解信息
}

3.3 元注解 - @Documented

3.4 元注解 - @Inherited

四、 注解与反射接口

通过反射获取注解的AnnotationElement,在使用方法进行解析

  • boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)
    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。注意:此方法会忽略注解对应的注解容器。
  • T getAnnotation(Class annotationClass)
    返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  • Annotation[] getAnnotations()
    返回该程序元素上存在的所有注解,若没有注解,返回长度为0的数组。
  • T[] getAnnotationsByType(Class annotationClass)
    返回该程序元素上存在的、指定类型的注解数组。

五、自定义注解

5.1 自定义

/**
 * 自定义注解
 * 
 */
@Target(Element.METHOD) // 注解的类型是method方法
@Retented(RetentedPolicy.RUNNING) // 注解存在的范围是持续到Running时期
public @interface MyMethodAnnotation {

    public string title()

    default "";

    public Stirng description() default "";

}

5.2 使用注解

/**
 * 使用注解
 * 
 */
@Override
@MyMethodAnnotation(title = "toStirngMethod", description = "overried toString method")
public class TestMethodAnnotation {
    public String toString (){
        return "Override toString method"
    }

  }

5.3 反射获取注解信息

/**
 * 通过反射获取注解内容
 * 
 */
public static void main(String[] args){
    try {
        // 获取类中所有的方法
        Method[] methods = TestMethodAnnotation.class.getClassLoader().loadClass(("com.TestMethodAnnotation")).getMethod();
        // 遍历所有方法
        for(Method method : methods ){
            if(method.isAnnotationPresent(MyMethodAnnotation.class)){
                try {
                    for(Annnotation anno = method.getDeclaredAnnotation()){
                        System.out.println("Annotation in Method '"+ method + "' : " + anno);
                    }
                    // 获取自定义的注解
                    MyMethodAnnotation myAnno =  method.getAnnotation(MyMethodAnnotation.class);
                    // 获取注解的值
                    String title = myAnno.title();
                } catch (THrowable e) {
                   e.printStackTrace(e);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值