java自定义注解

简介:

【第一部分】

首先了解一下java1.5起默认的三个annotation类型:

@override:只能用在方法上,用来告诉人们这个方法是改写的父类的

@Deprecated:建议别人不要使用旧的api的时候使用的,编译的时候会产生警告信息,可以设定在程序的所有元素上。

@SuppressWarnings:这一类型可以暂时把一些警告信息消除。

【第二部分】

先讲一下怎么自己设计一个annotation,最好的就是读以下jdk自带的annotation源文件

1、源文件Documented.class

[html]  view plain  copy
 print ?
  1. /*  
  2.  * @(#)Documented.java  1.6 05/11/17  
  3.  *  
  4.  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.  
  5.  * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.  
  6.  */  
  7.   
  8. package java.lang.annotation;  
  9.   
  10. /**  
  11.  * Indicates that annotations with a type are to be documented by javadoc  
  12.  * and similar tools by default.  This type should be used to annotate the   
  13.  * declarations of types whose annotations affect the use of annotated  
  14.  * elements by their clients.  If a type declaration is annotated with  
  15.  * Documented, its annotations become part of the public API  
  16.  * of the annotated elements.  
  17.  *  
  18.  * @author  Joshua Bloch  
  19.  * @version 1.6, 11/17/05  
  20.  * @since 1.5  
  21.  */  
  22. @Documented  
  23. @Retention(RetentionPolicy.RUNTIME)  
  24. @Target(ElementType.ANNOTATION_TYPE)  
  25. public @interface Documented {  
  26. }  

@Documented:作用是在生成javadoc文档的时候将该Annotation也写入到文档中。

2、Target.class

[html]  view plain  copy
 print ?
  1. /*  
  2.  * @(#)Target.java  1.6 05/11/17  
  3.  *  
  4.  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.  
  5.  * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.  
  6.  */  
  7.   
  8. package java.lang.annotation;  
  9.   
  10. /**  
  11.  * Indicates the kinds of program element to which an annotation type  
  12.  * is applicable.  If a Target meta-annotation is not present on an  
  13.  * annotation type declaration, the declared type may be used on any  
  14.  * program element.  If such a meta-annotation is present, the compiler  
  15.  * will enforce the specified usage restriction.  
  16.  *  
  17.  * For example, this meta-annotation indicates that the declared type is  
  18.  * itself a meta-annotation type.  It can only be used on annotation type  
  19.  * declarations:  
  20.  * <pre>  
  21.  *    @Target(ElementType.ANNOTATION_TYPE)  
  22.  *    public @interface MetaAnnotationType {  
  23.  *        ...   
  24.  *    }  
  25.  * </pre>  
  26.  * This meta-annotation indicates that the declared type is intended solely  
  27.  * for use as a member type in complex annotation type declarations.  It  
  28.  * cannot be used to annotate anything directly:  
  29.  * <pre>  
  30.  *    @Target({})   
  31.  *    public @interface MemberType {  
  32.  *        ...  
  33.  *    }  
  34.  * </pre>  
  35.  * It is a compile-time error for a single ElementType constant to  
  36.  * appear more than once in a Target annotation.  For example, the  
  37.  * following meta-annotation is illegal:  
  38.  * <pre>  
  39.  *    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})  
  40.  *    public @interface Bogus {  
  41.  *        ...  
  42.  *    }  
  43.  * </pre>  
  44.  */  
  45. @Documented  
  46. @Retention(RetentionPolicy.RUNTIME)  
  47. @Target(ElementType.ANNOTATION_TYPE)  
  48. public @interface Target {  
  49.     ElementType[] value();  
  50. }  

@Target 指示注释类型所适用的程序元素的种类。如果不指定则可以用在任一程序元素上。取值为枚举的数据类型Java.lang.annotation.ElementType,枚举项含义为:

   ANNOTATION_TYPE  注释类型声明

   CONSTRUCTOR  构造方法声明

   FIELD  字段声明(包括枚举常量)

   LOCAL_VARIABLE 局部变量声明

   METHOD  方法声明

   PACKAGE  包声明

   PARAMETER  参数声明

   TYPE  类、接口(包括注释类型)或枚举声明

3、Retention.class

[html]  view plain  copy
 print ?
  1. /*  
  2.  * @(#)Retention.java   1.6 05/11/17  
  3.  *  
  4.  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.  
  5.  * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.  
  6.  */  
  7.   
  8. package java.lang.annotation;  
  9.   
  10. /**  
  11.  * Indicates how long annotations with the annotated type are to  
  12.  * be retained.  If no Retention annotation is present on  
  13.  * an annotation type declaration, the retention policy defaults to  
  14.  * <tt>RetentionPolicy.CLASS</tt>.  
  15.  *  
  16.  * <p>A Target meta-annotation has effect only if the meta-annotated  
  17.  * type is use directly for annotation.  It has no effect if the meta-annotated  
  18.  * type is used as a member type in another annotation type.  
  19.  *  
  20.  * @author  Joshua Bloch  
  21.  * @since 1.5  
  22.  */  
  23. @Documented  
  24. @Retention(RetentionPolicy.RUNTIME)  
  25. @Target(ElementType.ANNOTATION_TYPE)  
  26. public @interface Retention {  
  27.     RetentionPolicy value();  
  28. }  

@Retention 指示注释类型的注释要保留多久。默认为 RetentionPolicy.CLASS。取值为枚举:

java.lang.annotation.RetentionPolicy:

   CLASS  编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。

   RUNTIME  编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

   SOURCE  编译器要丢弃的注释。

【第三部分】

下面我们自己来写一个注解类使用

1、Description

[html]  view plain  copy
 print ?
  1. import java.lang.annotation.Documented;  
  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.   
  7. @Target(ElementType.TYPE)  
  8. @Documented//作用是在生成javadoc文档的时候将该Annotation也写入到文档中。  
  9. @Retention(RetentionPolicy.RUNTIME)//指示注释类型的注释要保留多久。默认为 RetentionPolicy.CLASS。取值为枚举  
  10. /**  
  11.  * 注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名  
  12.  */  
  13. public @interface Description {  
  14.     String value() ;  
  15. }  

2、Name

[html]  view plain  copy
 print ?
  1. import java.lang.annotation.Documented;  
  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.   
  7. @Documented  
  8. @Target(ElementType.METHOD)  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10. /**  
  11.  * 使用了默认值  
  12.  */  
  13. public @interface Name {  
  14.     String work() default "JAVA";  
  15.     String community() default "BLOG";  
  16. }  

3、hzu_Opensource类

[html]  view plain  copy
 print ?
  1. @Description("吴海旭的社区测试")  
  2. public class hzu_Opensource {  
  3.     @Name(work="sales",community="ITeye")  
  4.     public String getName(){  
  5.         return null ;  
  6.     }  
  7.     @Name(community="csdn",work="IT")  
  8.     public String getName2(){  
  9.         return "csdn" ;  
  10.     }  
  11.     @Name  
  12.     public String getName3(){  
  13.         return null ;  
  14.     }  
  15. }  

4、测试类TestAnnotation

[html]  view plain  copy
 print ?
  1. import java.lang.reflect.Method;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4.   
  5.   
  6. public class TestAnnotation {  
  7.     @SuppressWarnings("unchecked")  
  8.     public static void main(String[] args) throws Exception {  
  9.          String CLASS_NAME = "hzu_Opensource" ;  
  10.          Class test = Class.forName(CLASS_NAME) ;  
  11.            
  12.          boolean flag = test.isAnnotationPresent(Description.class) ;  
  13.          if(flag){  
  14.              Description des = (Description)test.getAnnotation(Description.class) ;  
  15.              System.out.println("描述: " + des.value());  
  16.              System.out.println("---------------");  
  17.          }  
  18.          Method[] method = test.getMethods() ;  
  19.          Set<Method> set = new HashSet<Method>() ;  
  20.          for(int i=0;i<method.length;i++){  
  21.              boolean otherFlag = method[i].isAnnotationPresent(Name.class) ;  
  22.              if(otherFlag) set.add(method[i]) ;  
  23.          }  
  24.          for(Method m:set){  
  25.              Name name = m.getAnnotation(Name.class) ;  
  26.              System.out.println(name.work());  
  27.              System.out.println("社区:"  + name.community());  
  28.          }  
  29.     }  
  30. }  

结果为:

[html]  view plain  copy
 print ?
  1. 描述: 吴海旭的社区测试  
  2. ---------------  
  3. JAVA  
  4. 社区:BLOG  
  5. IT  
  6. 社区:csdn  
  7. sales  
  8. 社区:ITeye  
目录
相关文章
|
7天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
7天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
1月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
47 3
|
29天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
23天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
44 14
|
23天前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
29 12
|
30天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
17天前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
28 0
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
44 3