美文网首页
Java基础 -- Java注解使用方式

Java基础 -- Java注解使用方式

作者: tom_xin | 来源:发表于2018-09-09 21:36 被阅读0次

注解的基本概念

    注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。


定义注解的方式

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{

}

如上面代码中看到的,一个简单的自定义注解就这样诞生了。有的同学可能会奇怪,为什么需要有@Target,@Retention这两个注解来修饰我们自定义的注解@Test呢?原来当我们在定义注解时,需要用元注解来对我们的注解进行一定的说明。@Target用来定义你的注解将应用于什么地方(例如是一个方法或者一个域)。@Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE),在类文件中(ClASS)或者在运行时(RUNTIME)。


元注解

上面我们在自定义注解时,发现我们需要元注解来帮忙,那元注解到底有哪些呢?他们分别起的作用有事什么呢?让我们来一起看一下。

元注解 说明
@Target 表示该注解可以用于什么地方。可能的ElementType参数包括:CONSTRUCTOR:构造器的声明。 FIELD:域声明(包括enum实例)。LOCAL_VARIABLE:局部变量声明。METHOD:方法声明。PACKAGE:包声明。PARAMETER:参数声明。TYPE:类,接口(包括注解类)或enum声明。
@Retention 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:SOURCE:注解将被编译器丢弃。CLASS:注解在class文件中可用,但会被VM丢弃。RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在javadoc中。
@Inherited 允许子类继承父类中的注解。

注解元素

在注解中我们是可以自定义元素的。但是是不是所有的类型都可以作为注解的元素呢?下面我们一起来看一下Java中对注解元素的规定。

  1. 所有基本类型(int,float,boolean,double,long等)
  2. String
  3. Class
  4. enum
  5. Annotation
  6. 以上类型的数组

这里需要强调一下的是:不允许使用任何包装类型


默认值限制

在给我们自己定义的注解添加注解元素的时候,我们是可以给这些注解元素添加默认值的,这里对默认值有有一些要求,主要是一下两点:

  1. 元素不能有不确定的值。也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。
  2. 对于非基本类型的元素,无论在源代码中声明时,或是在注解接口中定义默认值时,都不能以null为其值。

动手试一试

写了这么多概念性的东西,感觉是时候动手写一下了。
首先我们自定义一个注解,

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest{
public String name() default "";
public int code() default 0;
public Class clazz() Object.class;
}

然后我们定义一个实体类

public class AnnotationModel{
     
     @AnnotationTest(name="时间",code=1,clazz=Date.class)
     public Date startDate;

     public Date getStartDate(){
          return startDate;
     }

     public void setStartDate(Date date) {
           this.startDate = date;
     }
}

最后,我们通过反射的方法获取到定义到FIELD中的注解信息。

public class AnnotationMain{
      public static void main(String[] args) {
           Class<?> modelClazz = AnnotationModel.class;
           Field[] fields = modelClazz.getDeclaredFields();
           for(Field field : fields) {
                 // 获取指定的注解
                 AnnotationTest annotationTest = field.getAnnotation(AnnotationTest.class);
                 if(null == annotationTest) {
                      continue;
                 }
                 System.out.println(annotationTest.name);
                 System.out.println(annotationTest.code);
                 System.out.println(annotationTest.clazz);
           }           
      } 
}

写到这里就差不多了,后面还有嵌套注解,感兴趣的同学可以自己尝试一下。

相关文章

  • Java注解+注解处理器

    Java注解基础注解处理器使用

  • Java基础 -- Java注解使用方式

    注解的基本概念 注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础(五)

    Java基础5 JAVA注解 1.注解的使用 定义:注解(Annotation),也叫元数据。一种代码级别的说明。...

  • 菜鸟学服务端技术----Spirng基础

    注解 Java基础加强总结(一)——注解(Annotation) java中的注解是如何工作的? java 注解 ...

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • 自定义注解

    java annotation基础 java注解分为标准注解和元注解。 标准注解是java为我们提供的预定义的注解...

  • Java注解详解,自定义注解,利用反射解析注解

    概要 这篇文章将会带领你了解Java注解,注解的使用,注解的解析,利用反射解析运行时注解,相信有一定Java基础的...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

网友评论

      本文标题:Java基础 -- Java注解使用方式

      本文链接:https://www.haomeiwen.com/subject/arnrgftx.html