本文总结的注解annotation的创建、使用以及得到注解信息,本文总结的是类上的、方法上的和字段上的注解,创建的工程如下:
一、首先介绍创建注解所用到的元注解(先有个了解即可,可略过)
1、@Target表示该注解可以用到什么地方,可能得ElementType参数包括:
CONSTRUCTOR构造器的声明
FIELD域声明(我理解的就是字段,也就是变量)
LOCAL_VARIABLE局部变量声明
METHOD方法声明
PACKAGE包声明
PARAMETEY参数声明
TYPE类、接口或enum声明
@Retention表示需要在什么级别保存该注解信息,可选的RetentionPolicy参数包括:
SOURCE注解将被编译器丢弃
CLASS注解在class文件中可用,但会被VM丢弃
RUNTIME在运行期也可以保存注解,因此能够通过反射机制读取注解信息
@Document将此注解包含在文档中
@Inherited允许子类继承父类中的注解
二、类 级别注解的创建、使用以及得到信息
1、创建注解:
package com.wang.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 作用在类、接口、或enum声明上的注解 * @author HeJW * */ @Target(ElementType.TYPE)//作用在类、接口、或enum声明 @Retention(RetentionPolicy.RUNTIME) public @interface ClassAnnotation { public String name(); public String description() default "no description "; }
2、使用,也就是只能在类上面才能使用上面的注解:
@ClassAnnotation(name = "class name is annotationBean") public class AnnotationBean {.......}
3、得到注解信息
Class<?> cl = Class.forName("com.wang.annotation.bean.AnnotationBean"); //得到类上的annotation ClassAnnotation ca = cl.getAnnotation(ClassAnnotation.class); System.out.println(ca.name()); System.out.println(ca.description());
三、方法上的
1、定义注解:
package com.wang.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 作用在方法上的注解 * @author HeJW * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MethodAnnotation { public String name(); public String description() default "no description"; }
2、使用,只能在方法上使用:
@MethodAnnotation(name = "method name is methodTest", description = "method's name") public void methodTest(){ System.out.println("test"); } @MethodAnnotation(name = "method name is getId", description = "get id") public int getId() { return id; }
3、得到信息:
//得到方法上的annotation //for( Method m : cl.getDeclaredMethods() ){ for( Method m : cl.getMethods() ){ MethodAnnotation ma = m.getAnnotation(MethodAnnotation.class); //有的方法上有annotation,有的方法上没有annotation if( ma != null ){ System.out.println(ma.name()); System.out.println(ma.description()); } }
四、变量上的
1、为了下一步的说明,定义两个地段上的注解:
package com.wang.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FieldAnnotation1 { public String name(); public String description() default "no description "; }
另一个与这个基本相同:
package com.wang.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FieldAnnotation2 { public int value(); public String type(); }
2、使用:
@FieldAnnotation1(name="attribute name is id") @FieldAnnotation2(value=99,type="int") private int id; @FieldAnnotation1(name="attribute name is desc", description="descript attribute") private String desc;
3、得到信息:
//得到属性上的annotation for ( Field field : cl.getDeclaredFields() ) { FieldAnnotation1 fa1 = field.getAnnotation(FieldAnnotation1.class); if(fa1 != null){ System.out.println(fa1.name()); System.out.println(fa1.description()); } FieldAnnotation2 fa2 = field.getAnnotation(FieldAnnotation2.class); if(fa2 != null){ System.out.println(fa2.value()); System.out.println(fa2.type()); } }
五、除了能够得到指定的注解信息外,还能够通过得到annotation数组的形式得到注解信息
//以获取属性上的annotation为例,获取注解的annotation数组 for ( Field field : cl.getDeclaredFields() ) { Annotation[] anns = field.getDeclaredAnnotations(); if( anns[0] instanceof FieldAnnotation1 ){ FieldAnnotation1 fa1 = (FieldAnnotation1)anns[0]; System.out.println(fa1.name()); System.out.println(fa1.description()); } }
六、使用注解和得到注解信息的 完整代码
1、使用注解的完整代码:
package com.wang.annotation.bean; import com.wang.annotation.ClassAnnotation; import com.wang.annotation.FieldAnnotation1; import com.wang.annotation.FieldAnnotation2; import com.wang.annotation.MethodAnnotation; /** * 使用自定义annotation * @author HeJW * */ @ClassAnnotation(name = "class name is annotationBean") public class AnnotationBean { @FieldAnnotation1(name="attribute name is id") @FieldAnnotation2(value=99,type="int") private int id; @FieldAnnotation1(name="attribute name is desc", description="descript attribute") private String desc; @MethodAnnotation(name = "method name is methodTest", description = "method's name") public void methodTest(){ System.out.println("test"); } @MethodAnnotation(name = "method name is getId", description = "get id") public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
2、得到注解信息的完整代码:
package com.wang.annotation.app; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.wang.annotation.ClassAnnotation; import com.wang.annotation.FieldAnnotation1; import com.wang.annotation.FieldAnnotation2; import com.wang.annotation.MethodAnnotation; /** * 测试类 * @author HeJW * */ public class AnnotationTestApp { public static void main(String[] args) throws Exception { Class<?> cl = Class.forName("com.wang.annotation.bean.AnnotationBean"); //得到类上的annotation ClassAnnotation ca = cl.getAnnotation(ClassAnnotation.class); System.out.println(ca.name()); System.out.println(ca.description()); //得到方法上的annotation //for( Method m : cl.getDeclaredMethods() ){ for( Method m : cl.getMethods() ){ MethodAnnotation ma = m.getAnnotation(MethodAnnotation.class); //有的方法上有annotation,有的方法上没有annotation if( ma != null ){ System.out.println(ma.name()); System.out.println(ma.description()); } } //得到属性上的annotation for ( Field field : cl.getDeclaredFields() ) { FieldAnnotation1 fa1 = field.getAnnotation(FieldAnnotation1.class); if(fa1 != null){ System.out.println(fa1.name()); System.out.println(fa1.description()); } FieldAnnotation2 fa2 = field.getAnnotation(FieldAnnotation2.class); if(fa2 != null){ System.out.println(fa2.value()); System.out.println(fa2.type()); } } //以获取属性上的annotation为例,获取注解的annotation数组 for ( Field field : cl.getDeclaredFields() ) { Annotation[] anns = field.getDeclaredAnnotations(); if( anns[0] instanceof FieldAnnotation1 ){ FieldAnnotation1 fa1 = (FieldAnnotation1)anns[0]; System.out.println(fa1.name()); System.out.println(fa1.description()); } } } }
相关推荐
SpringBoot核心配置与注解
### Java注解学习 #### 知识点概览 Java注解是Java 5.0引入的一个重要特性,用于向代码添加元数据,而不影响其实际功能。它们为开发过程中的自动化工具、编译器检查、运行时元数据读取等提供了强大的功能。本文将...
本篇“Android学习日记-4 JAVA注解总结”将深入探讨Java注解及其在Android中的应用。 一、Java注解概述 Java注解是一种类型安全的元数据机制,自Java 5引入以来,已经在各种框架和库中广泛应用。注解通过@符号开头...
1. **JSP注释**: - 单行注释:`<%-- comment --%>`,这种注释在JSP转换为Servlet时会被忽略,不会出现在生成的HTML中。 - HTML注释:`<!-- comment -->`,这种注释会出现在最终发送给客户端的HTML文档中。 2. **...
Java学习总结 本文档主要总结了Java学习的主要知识点,包括Java的基本概念、变量、数据类型和运算符、选择结构、循环结构、数组等。通过对这些知识点的讲解,使读者能够深入了解Java语言的基本结构和编程思想。 一...
FPGA学习总结报告 FPGA(Field-Programmable Gate Array),即现场可编程逻辑阵列,它的内部由逻辑单元组成,这些逻辑单元之间可以通过线连接,根据应用者的逻辑写入,重新组合逻辑单元,以实现不同的逻辑编写。...
1. **配置**:创建Spring MVC应用始于配置,包括web.xml中的DispatcherServlet配置、Spring的ApplicationContext配置以及MVC的配置(如`@Controller`、`@RequestMapping`等注解的使用)。 2. **控制器(Controller...
这篇文档是个人的Java学习笔记总结,旨在帮助0基础的学习者从零开始掌握Java基础知识,并逐步成为专业的Java开发者。以下是笔记中涉及的一些关键知识点: 1. **Java开发环境的设置**: 要开始Java编程,首先需要...
总结来说,JS学习涉及基础语法、数据类型、进制转换、错误处理等多个方面,理解这些基础知识对于深入学习和应用JavaScript至关重要。同时,了解和掌握像jQuery这样的库可以帮助开发者更高效地处理DOM操作,提高开发...
"GitHub优秀的学习总结资料2"这个压缩包很可能包含了广大开发者在GitHub上分享的精选学习资源,其中"xmind"文件可能是一个思维导图,用于整理和展示知识结构。下面将详细探讨与这些内容相关的知识点。 首先,GitHub...
以下是对MATLAB学习的总结和知识点详解: 1. **书写语句的标点符号** - **逗号**: 使用逗号分隔赋值语句中的元素,会将每个赋值的结果在命令窗口中逐一输出。 - **分号**: 当在语句末尾使用分号时,MATLAB不会...
总结而言,文档强调了Spring注解开发的便利性和高效性,尤其是对于即将学习SpringBoot的开发者来说,理解这些注解能够帮助他们更快地适应SpringBoot的开发模式。通过注解的方式替代XML配置,可以让代码更加简洁,...
这份“java学习笔记总结”涵盖了作者在深入学习Java过程中积累的知识点和实践经验,旨在帮助读者理解和掌握Java的核心概念。 首先,Java的基础部分包括语法、变量、数据类型、运算符和流程控制。Java支持八种基本...
1. **工作总结撰写**:学习委员在学期末需要撰写工作总结,这份总结应包含三个方面:标题明确为“学习委员工作总结”,注释部分详细回顾工作内容,包括成功与挑战,最后是落款。注释部分需按前言、主体和结语结构...