深入注解:在Java中设计和使用自己的注解

开发 后端
我们用过JDK给我们提供的 @Override @Deprecated @SuppressWarning 注解 ,这些注解是JDK给我们提供的,我们只是在用别人写好的东西,那么我们是否可以自己写注解呢?当然是可以的。

我们用过JDK给我们提供的 @Override @Deprecated @SuppressWarning 注解 ,这些注解是JDK给我们提供的,我们只是在用别人写好的东西,那么我们是否可以自己写注解呢?当然是可以的。

我们写的注解包括三个环节:

1、 注解的声明,也就是注解类的定义。

形式如下 @interface 来进行注解的声明。

  1. package me.test;     
  2.  
  3. import java.lang.annotation.* ;//导入注解包中所有注解  
  4.  
  5. @Retention(RetentionPolicy.RUNTIME)   //解释如下  
  6.  
  7. @Target(ElementType.TYPE)//解释如下  
  8.  
  9. public @interface MyAnnotation               
  10. {   
  11.  
  12. }  
  13.  
  14. @Retention(RetentionPolicy.RUNTIME)  

指定了注解保留的周期,注解的生命周期有是三个,RetentionPolicy 枚举的三个值代表了三个声明周期,默认是CLASS。

枚举常量摘要
CLASS
          编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RUNTIME
          编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
SOURCE
          编译器要丢弃的注释。

 @Target(ElementType.TYPE)

这个标识注解应该标在那里ElementType的几个枚举值就代表了,注解应该写在的位置。

CONSTRUCTOR
          构造方法声明
FIELD
          字段声明(包括枚举常量)
LOCAL_VARIABLE
          局部变量声明
METHOD
          方法声明
PACKAGE
          包声明
PARAMETER
          参数声明
TYPE
          类、接口(包括注释类型)或枚举声明

 2、 使用了注解的类或者方法。

  1. @MyAnnotation 
  2. class  A  
  3. {  

3、 利用反射来操作注解,详细见代码。

Class类有一个方法:

<A extends Annotation>
A
   getAnnotation(Class<A> annotationClass)

 这个方法接受一个注解的字节码参数 ,然后返回这个类所标识的注解对象 ,因为我们标识了一个注解就相当于产生了一个注解对象 。

boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

 这个方法判断一个类是否被注解所标识。

下面是代码示例:

MyAnnotationTest.java中

  1. package me.test;  
  2. import java.lang.annotation.Annotation;  
  3. @MyAnnotation 
  4. public class MyAnnotationTest  
  5. {   
  6.  
  7.     public static void main(String []args)  
  8.     {  
  9.      if(MyAnnotationTest.class.isAnnotationPresent( MyAnnotation.class))  
  10.      {  
  11.        MyAnnotation an=(MyAnnotation)MyAnnotationTest.class.getAnnotation(MyAnnotation.class) ;  
  12.        System.out.println(an.toString());  
  13.      }  
  14.     }  

MyAnnotation.java中

  1. package me.test;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6. @Retention(RetentionPolicy.RUNTIME)  
  7. @Target(ElementType.TYPE)  
  8. public @interface MyAnnotation  
  9. {   
  10.  

 原文链接:http://blog.csdn.net/yue7603835/article/details/7234786

【编辑推荐】

  1. Java类加载器以及类加载器的委托模型
  2. Java中Class对象详解
  3. Java API设计清单
  4. Java远程方法调用RMI
  5. Java编程:常见问题汇总
责任编辑:林师授 来源: yue7603835的博客
相关推荐

2021-12-30 12:30:01

Java注解编译器

2024-03-07 08:22:51

Java机制元数据

2022-11-11 08:31:39

Java注解注解类

2022-12-14 09:10:06

JAVA注解继承

2017-11-17 09:13:31

Java注解

2021-03-26 09:37:12

Java开发代码

2020-03-06 10:25:10

注解Java代码

2023-03-30 16:16:00

Java自定义注解开发

2023-06-30 08:26:24

Java注解Java程序元素

2016-12-02 17:32:45

LinuxGlyphr

2021-03-08 00:11:02

Spring注解开发

2020-09-04 13:30:43

Java自定义代码

2020-12-02 11:56:16

Java注解Excel

2021-04-21 08:56:46

Java注解反射

2009-06-15 17:48:32

Spring注解注入属性

2023-08-26 11:36:31

Java框架Spring

2024-01-18 09:38:00

Java注解JDK5

2017-12-22 09:59:43

2020-12-10 08:21:27

XML映射Mybatis

2023-07-26 00:32:33

注解抽象spring
点赞
收藏

51CTO技术栈公众号