Java注解类 - 注解类入门

2019-07-18  本文已影响0人  小赵营

茨威格在《人类群星闪耀时》写到那些改变历史进程的小人物。原本默默无闻,却一鸣惊人。我们日常生活中,容易被忽略的细节,当真正了解它时,顿时"斯巴达"了。'Java注解类'在我心里就属于貌不惊人狠角色。

本文介绍注解类简介和如何自定义自己的注解类。

概要

单纯说注解,注解本身意义并不大。作为标签对对象的注释,比如生成doc的注释,函数已废弃.... 简单说和注释没啥区别。而它发挥巨大作用的是:注解解释类,也就是相关对代码进行解释的特定类。

注解类神奇功效是:通过注解和反射这两者的结合使用达成的。现在很多流行的开源框架都是基于注解类实现。可关注下spring rpc.....等各种开源框架。

本文内容包括:

认识注解类

简单来说,注解类就是标签。只是标签分为不同的种类,对应的作用域和使用方式也千差万别。从功能上而言:这些标签分为: 基本注解、元注解、自定义注解。

基本注解

基本注解类是基于JVM虚拟机的语言,提供的系统注解。也是基本的通用注解类。
比如自Java 1.5版本以来提供的@override@deprecated,和 1.8版本的@FunctionalInterface ...

元注解

在我们翻看注解类源码的时候,总会有如下定义:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

@Documented,@Retention(RetentionPolicy.RUNTIME),@Target(ElementType.TYPE) 使用过注解,我们知道这些都是注解。为基本注解作注,意味者特殊身份 -- 元注解。

所以元注解定义是: 元注解是标记其他注解注解。就有像标识性别是人必须的一个标签。元注解就像性别。描述人必须有性别,那么注解类也需要元注解标注。

元注解不能作用于具体函数变量等,如下操作报错@Target not applicatable to type

    @Target() //func是使用方式,不是注解。所以不能作用
    public void func() {
        System.out.printf("test func");
    }

只能作用于注解类上。那么,元注解又有哪些类别,功能又有哪些哪?

元注解分类

有限的元注解涵盖了文档、代码编译、运行时标注等功能。实际上,它量不大,功能却是大千世界。

自定义注解类

程序猿毛病之一:喜欢自己DIY,什么都要自己练练。我也要手动写注解类。
下面代码包括:变量的自定义注解、和方法的自定义注解,以及通过代码如何读取到注解内容。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnnotation {

    String value() default "call test annotation";
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {
    String value() default "MethodAnnotation";
}

代码:把自定义注解分别用在函数和变量上

public class TestSelfAnnotation {

    @MethodAnnotation(value="TestSelfAnnotation MethodAnnotation")
    public void printAnnotation() {
        System.out.printf("function printAnnotation");
    }
    @FieldAnnotation(value="TestSelfAnnotation field")
    Integer testVar = 0;
/*     void  main(String [] args) {
        TestSelfAnnotation a = new TestSelfAnnotation();
        FieldAnnotation b = a.getClass().getAnnotation(FieldAnnotation.class);
        System.out.printf(b.value());
    }*/

} 
测试用例,获取注解类
  val a = new TestSelfAnnotation //定义类
   a.printAnnotation() //调用函数
   val b = a.getClass //获取类class
   val anno = b.getDeclaredMethods
   if(anno == null) println("anno is null") else println(s"anno not null ${anno.getClass.getName}")
    for(mt <- anno) { //!!!!! 同一个方法中可以有多个注解类,所以需要指定注解,才能获取值
      println(mt.getAnnotation(classOf[MethodAnnotation]).value())
    }

   val filed = b.getDeclaredField("testVar") //设定获取 testVar变量的注解
   println(filed.getAnnotation(classOf[FieldAnnotation]).value()) // classOf需要指定注解类类型是 FieldAnnotation,而不是声明TestSelfAnnotation 
function printAnnotation
anno not null ....
TestSelfAnnotation MethodAnnotation //不同注解作用对象不同
TestSelfAnnotation field

后续

文章是对java注解的入门介绍,接着自定义注解的例子。建立了解注解类的信心,为后续的使用注解对单体架构进行微服务化改造开个好头。

有帮助的话,留个赞呗。没有的话,留个赞鼓励下。_
上一篇 下一篇

猜你喜欢

热点阅读