深入了解java之注解详解

什么是注解

 随着现在的轮子越来越成熟,框架也越来越丰富,特别是springboot的推出,很多人可以通过一个简单的注解就可以节省掉很多的工作。那什么是注解呢?

 大家都知道注释,注释是解释代码的意图,是给人看的。但是注解是给代码看的,注解大概的意思给我们的方法或者类打上一个标签,然后就可以通过反射之类的东西拿到反射的信息,然后进行处理。

注解的使用流程

 注解的使用有三个步骤,分别是:定义注解、使用注解、读取注解。如下图:

定义一个注解来学会注解

import java.lang.annotation.*;

/**
 * 元注解:简单地来说就是可以用来java用来提供注解其他注解的注解(有点拗口,大概意思就是标记来给JVM或者编译器看的)
 *       java目前提供5种元注解:Target,Retention,Documented,Inherited,Repeatable(下面都用在自定义注解ANO上)
 */

/**
 *  表示注解可以用于哪些地方(如果没有指定,默认是所有地方)。可能的 ElementType 参数包括:
 *      CONSTRUCTOR:构造器的声明
 *      FIELD:字段声明(包括 enum 实例)
 *      LOCAL_VARIABLE:局部变量声明
 *      METHOD:方法声明
 *      PACKAGE:包声明
 *      PARAMETER:参数声明
 *      TYPE:类、接口(包括注解类型)或者 enum 声明
 */
//@Target(ElementType.TYPE)

/**
 * 表示注解信息保存的时长(如果没有指定,默认是RetentionPolicy.CLASS,如果是通过反射获取的话,这个需要声明为RUNTIME)。可选的 RetentionPolicy 参数包括:
 * SOURCE:注解将被编译器丢弃
 * CLASS:注解在 class 文件中可用,但是会被 VM 丢弃。
 * RUNTIME:VM 将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
 */
@Retention(RetentionPolicy.RUNTIME)
/**
 * 将此注解保存在 Javadoc 中
 */
@Documented
/**
 *允许子类继承父类的注解
 */
@Inherited
/**
 * 允许一个注解可以被使用一次或者多次(Java 8)。
 * 可参考(https://cloud.tencent.com/developer/article/1579167)
 */
//@Repeatable(A.class)

/**
 * 注意:不能使用extends继承注解,也就是说注解不支持继承,@Inherited只是子类继承父类的注解,
 * 不是子注解继承父注解。可以用父注解来注解子注解,来实现继承的效果。
 */
public @interface ANO {
    /**
     * 注解元素可用的类型如下所示:
     *      所有基本类型(int、float、boolean等)
     *      String
     *      Class
     *      enum
     *      Annotation
     *      以上类型的数组
     */
    String value0() default "...";//用default指定默认值
}

其他常用注解:

@Override 表示当前方法覆盖了父类的方法
@Deprecation 表示方法已经过时,方法上有横线,使用时会有警告。
@SuppviseWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)**

如何读取注解

public class Main {
    public static void main(String[] args) throws Exception {
        Class<UseAno> clazz = UseAno.class;

        //获取类上的注解
        System.out.println(clazz.getAnnotation(ANO.class).value0());
        //获取成员变量的注解
        System.out.println(clazz.getField("field").getAnnotation(ANO.class).value0());
        //获取方法上的注解
        System.out.println(clazz.getMethod("getField",null).getAnnotation(ANO.class).value0());
    }
}

@ANO(value0 = "class-ano")
class UseAno {
    @ANO(value0 = "field-ano")
    public String field;

    @ANO(value0 = "method-ano")
    public String getField() {
        return field;
    }
}

写在最后

 其实注解大概就是这样,三部曲,先定义一个自定义的注解,在自己需要的地方打上注解,然后读取注解,再进行其他的逻辑操作,其中读取一般也是利用反射,得到类名、成员变量和方法之类的,读取注解信息来进行操作。如果想要更深入,可以看java编程思想.和自定义Junit框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值