【JAVA】java注解的自定义和使用

java注解概念

  Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法

java注解介绍

  常用注解

  @Override:表示方法是重写的方法

  @Deprecated:过时的方法

  @SuppressWarnings:抑制警告

  注解分类

  按照运行机制分

  1、源码注解:注解只在源码中存在,编译成.class文件就不存在了

  2、编译时注解:注解在源码和.class文件中都存在,如@Override

  3、运行时注解:在运行阶段起作用,甚至会影响运行逻辑,如@Autowired

  按照来源分

  1、JDK自带注解

  2、第三方注解

  3、自定义注解

自定义注解和使用

  1、使用@interface关键定义注解(Description.java),如下:

 1 package com.hd;
 2
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Inherited;
 6 import java.lang.annotation.Retention;
 7 import java.lang.annotation.RetentionPolicy;
 8 import java.lang.annotation.Target;
 9
10 /**
11  * 注解的注解:元注解
12  *
13  * 注解作用域
14     ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
15     ElementType.FIELD:允许作用在属性字段上
16     ElementType.METHOD:允许作用在方法上
17     ElementType.PARAMETER:允许作用在方法参数上
18     ElementType.CONSTRUCTOR:允许作用在构造器上
19     ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
20     ElementType.ANNOTATION_TYPE:允许作用在注解上
21     ElementType.PACKAGE:允许作用在包上
22
23     注解的生命周期
24     RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
25     RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
26     RetentionPolicy.RUNTIME:永久保存,可以反射获取
27  *
28  */
29 // 注解的作用域
30 @Target({ElementType.METHOD, ElementType.TYPE})
31 // 注解的生命周期
32 @Retention(RetentionPolicy.RUNTIME)
33 // 允许子类继承
34 @Inherited
35 // 生成javadoc的时候生成注解的信息
36 @Documented
37 // @interface:使用@interface关键定义注解
38 public @interface Description {
39
40     // 注解的成员
41     // 成员类型所限的,合法的类型包括原始数据类型及String、Class、Annotation、Enumeration
42     String desc();
43
44     String author();
45
46     // 成员以无参无异常方式生命,可以用default为成员指定一个默认值
47     int age() default 18;
48
49     // 如果注解成员只有一个时,成员名必须取名未value(),在使用时可以忽略成员名和赋值号(=)
50     // 注解可以没有成员,没有成员的注解成为标识注解
51 }

  2、在普通类上使用注解,使用方法

    注解使用: @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)

    如下:

 1  package com.hd;
 2
 3  /**
 4   * 注解使用:
 5   * @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)
 6   * @author H__D
 7   * @date 2019-07-09 22:49:32
 8   *
 9   */
10 @Description(desc="I am class annotation", author="hd")
11 public class TestDescription {
12
13     @Description(desc="I am method annotation", author="hd")
14     public String test(){
15
16         return "red";
17     }
18
19
20 }

  3、解析注解,通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑

 1 package com.hd;
 2
 3 import java.lang.annotation.Annotation;
 4 import java.lang.reflect.Method;
 5
 6 /**
 7  * 解析注解
 8  * 通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
 9  *
10  * 对于一个类或者接口来说,Class 类中提供了以下一些方法用于反射注解。
11     getAnnotation:返回指定的注解
12     isAnnotationPresent:判定当前元素是否被指定注解修饰
13     getAnnotations:返回所有的注解
14     getDeclaredAnnotation:返回本元素的指定注解
15     getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的
16  *
17  * @author H__D
18  * @date 2019-07-09 22:52:42
19  *
20  */
21 public class ParseDecription {
22
23     public static void main(String[] args) {
24         // TODO Auto-generated method stub
25         // 1、使用类加载器加载类
26         try {
27             Class c = Class.forName("com.hd.TestDescription");
28             System.out.println(c);
29
30             // 2、找到类上面的注解
31             boolean isExist = c.isAnnotationPresent(Description.class);
32
33             if(isExist) {
34                 // 3、拿到注解实例
35                 Description d = (Description) c.getAnnotation(Description.class);
36                 System.out.println("========parse class annotation=========");
37                 System.out.println("desc = " + d.desc());
38                 System.out.println("author = " + d.author());
39                 System.out.println("age = " + d.age());
40             }
41
42             // 4、找到方法上的注解
43             Method[] ms = c.getMethods();
44             for (Method m : ms) {
45                 boolean isMExist = m.isAnnotationPresent(Description.class);
46                 if(isMExist) {
47                     Description d = m.getAnnotation(Description.class);
48                     System.out.println("========parse method annotation=========");
49                     System.out.println("desc = " + d.desc());
50                     System.out.println("author = " + d.author());
51                     System.out.println("age = " + d.age());
52                 }
53             }
54
55             // 另外一种解析方法
56             for (Method m : ms) {
57                 Annotation[] annotations = m.getAnnotations();
58                 for (Annotation annotation : annotations) {
59                     if(annotation instanceof Description) {
60                         System.out.println("========parse method annotation other way=========");
61                         Description d = (Description) annotation;
62                         System.out.println("desc = " + d.desc());
63                         System.out.println("author = " + d.author());
64                         System.out.println("age = " + d.age());
65                     }
66                 }
67             }
68
69         } catch (ClassNotFoundException e) {
70             // TODO Auto-generated catch block
71             e.printStackTrace();
72         }
73     }
74 }

  4、运行结果如下:

    

  

原文地址:https://www.cnblogs.com/h--d/p/11161234.html

时间: 2024-08-29 20:47:52

【JAVA】java注解的自定义和使用的相关文章

[2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.J

Java:注解(Annotation)自定义注解

入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. -------------------------------------------------------------------------------- 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 a

深入浅出Java Annotation(元注解和自定义注解)

一.基本概述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中. 二.原理 Annotation其实是

(转载)深入理解Java:注解(Annotation)自定义注解入门

深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email prote

java的Annotation注解和自定义注解

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //target 代表目标 value里面可以是值也可以是数组 METHOD(方法) TYPE(类型) @Target(value={ElementType.METHOD,Ele

自己写的基于java Annotation(注解)的数据校验框架

JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方便和重用,自己写了一个简单的基于Annotation的校验框架.有兴趣的可以扩展. 框架说明: AnnotationValidable接口:所有需要使用该校验框架的类都要实现它,该类中没有任何方法需要实现,仅仅是一个表明那些类需要使用该校验框架的标识. GetFiledValue类:是一个工具类,对

深入理解Java:注解(Annotation)--注解处理器

深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口.除此之外,Java在java.l

java之注解

  1.元注解   元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS)  // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得, @Retention(Retent

第17篇-JAVA Annotation 注解

第17篇-JAVA Annotation 注解 每篇一句 :真的努力后你会发现自己要比想象的优秀很多 初学心得: 怀着一颗奋斗不息的心,一切困苦艰辛自当迎刃而解 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-17| JAVA Annotation注解 ] 1.什么是注解(Annotation) Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行.在Java技术

Java中注解

Java中Annotation其实就是代码里的特殊标记,它可以用来代替配置文件 自定义注解的步骤: 1.编写注解类: 使用@interface 定义 package cn.cqu.huang; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.