java注解:附在代码中的一些元信息,用于在编译、运行时起到说明、配置的功能。
一、元注解
java提供了4种元注解用于注解其他注解,所有的注解都是基于这四种注解来定义的。
@Target注解:用于描述注解的使用范围,超出范围时编译失败。
取值类型(ElementType):
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域(成员变量)
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
例如:
- @Target(ElementType.TYPE)
- public @interface MyAnnotation {
- //类名注解,默认即为当前类名
- String name() default "className";
- }
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Target;
- //字段注解
- @Target(ElementType.FIELD)
- public @interface MyAnnotation1 {
- String name() default "fieldName";
- String getFieldValue() default "getField";
- String setFieldValue() default "setField";
- }
@Retention:描述注解的生命周期,即注解的生效范围。
取值范围(RetentionPolicy):
1.SOURCE:在源文件中生效,仅存在java文件中,class文件将会去除注解。
2.CLASS:在class文件中生效,仅保留在class文件中,运行时无法获取注解。
3.RUNTIME:在运行时生效,保留在class文件中且运行时可通过反射机制获取。
例如:
- @Target(ElementType.FIELD) //字段注解
- @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息
- public @interface MyAnnotation1 {
- String name() default "fieldName";
- String getFieldValue() default "getField";
- String setFieldValue() default "setField";
- }
@Documented:用于指定javac生成API时显示该注解信息。
例如:
- @Target(ElementType.FIELD) //字段注解
- @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息
- @Documented //在生成javac时显示该注解的信息
- public @interface MyAnnotation1 {
- String name() default "fieldName";
- String getFieldValue() default "getField";
- String setFieldValue() default "setField";
- }
@Inherited:标明该注解可以由子类继承,及子类可以继承父类的注解。而默认情况下,子类是不继承父类注解的。
例如:
- @Target(ElementType.FIELD) //字段注解
- @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息
- @Documented //在生成javac时显示该注解的信息
- @Inherited //标明MyAnnotation1注解可以被使用它的子类继承
- public @interface MyAnnotation1 {
- String name() default "fieldName";
- String getFieldValue() default "getField";
- String setFieldValue() default "setField";
- public enum FieldValue{MYTEST,MYFIELD,MYVALUE};
- FieldValue realVale() default FieldValue.MYFIELD;
- }
二、读取注解
通过反射机制我们可以读取注解信息。java在java.lang.reflect包下新增了AnnotatedElement接口,该接口定义了可以接受注解的元素为:Class(类)、Constructor(构造器)、Field(字段)、Method(方法)、Package(包)。
AnnotatedElement是所有注解元素的父接口,所有的注解元素都可以通过某个类反射获取AnnotatedElement对象,该对象有一下4个方法来访问Annotation信息。
(1)<T extends Annotation> T getAnnotation(Class<T> annotationClass)
返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
(2)Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
(3)boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)
判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
(4)Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
例如:
注解:
- package com.dhcc.iscp.web.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息
- public @interface MyAnnotation {
- //类名注解,默认即为当前类名
- String name() default "className";
- }
- package com.dhcc.iscp.web.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.FIELD) //字段注解
- @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息
- @Documented //在生成javac时显示该注解的信息
- @Inherited //标明MyAnnotation1注解可以被使用它的子类继承
- public @interface MyAnnotation1 {
- String name() default "fieldName";
- String getFieldValue() default "getField";
- String setFieldValue() default "setField";
- public enum FieldValue{MYTEST,MYFIELD,MYVALUE};
- FieldValue realValue() default FieldValue.MYFIELD;
- }
实体类:
- package com.dhcc.iscp.web.annotation;
- import com.dhcc.iscp.web.annotation.MyAnnotation1.FieldValue;
- @MyAnnotation(name="myTest")
- public class MyTest {
- @MyAnnotation1
- String myTest;
- @MyAnnotation1(name="test",getFieldValue="1",setFieldValue="2",realValue=FieldValue.MYVALUE)
- String testValue;
- public String getMyTest() {
- return myTest;
- }
- public void setMyTest(String myTest) {
- this.myTest = myTest;
- }
- public String getTestValue() {
- return testValue;
- }
- public void setTestValue(String testValue) {
- this.testValue = testValue;
- }
- }
测试类:
- package com.dhcc.iscp.web.annotation;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- public class TestAnnotation {
- public static void main(String[] args){
- MyTest myTest = new MyTest();
- Annotation[] annotations = myTest.getClass().getAnnotations(); //获取类的所有注解
- for(Annotation anno:annotations){
- if(anno instanceof MyAnnotation){
- MyAnnotation myAnnotation = (MyAnnotation)anno;
- System.out.println("className:"+myAnnotation.name());
- }else if(anno instanceof MyAnnotation1){
- MyAnnotation1 myAnnotation1 = (MyAnnotation1)anno;
- System.out.println("FiledName:"+myAnnotation1.name());
- System.out.println("setFieldValue"+myAnnotation1.setFieldValue());
- System.out.println("getFieldValue"+myAnnotation1.getFieldValue());
- System.out.println("realValue"+myAnnotation1.realValue());
- }
- }
- Field[] fields = myTest.getClass().getDeclaredFields();//获取所有注解字段
- for(Field field:fields){
- if(field.isAnnotationPresent(MyAnnotation1.class)){
- MyAnnotation1 myAnno = (MyAnnotation1)field.getAnnotation(MyAnnotation1.class);
- System.out.println(field.getName()+"-name:"+myAnno.name());
- System.out.println(field.getName()+"-getFieldValue:"+myAnno.getFieldValue());
- System.out.println(field.getName()+"-setFieldValue:"+myAnno.setFieldValue());
- System.out.println(field.getName()+"-realValue:"+myAnno.realValue());
- }
- }
- Method[] methods = myTest.getClass().getMethods();//获取所有方法
- for(Method method:methods){
- if(method.isAnnotationPresent(MyAnnotation1.class)){
- MyAnnotation1 myAnno1 = (MyAnnotation1)method.getAnnotation(MyAnnotation1.class);
- System.out.println(myAnno1.getClass());
- }
- }
- }
- }
测试结果:
三、自定义注解
自定义注解是通过@interface来声明的,其中的每一个方法实际上是声明了一个配置参数,参数名称即为方法名,参数类型即为返回值类型。
自定义注解的格式:
public @interface 注解名{定义体}
注解参数可支持的类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
注解参数的定义规则:
a.只能使用public或默认2种访问修饰,例如:String getName();这里getName()就是使用了默认访问权限。
b.参数类型只能使用上面提到的6种情况
c.如果只有一个参数成员,最好将参数名定义为:value()。
d.注解元素必须有确定值,要么在定义的时候设置默认值,要么在使用注解的时候设置参数值。
相关推荐
总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...
总的来说,Spring自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...
Spring 自定义注解和 Aspect 的使用 在本文中,我们将学习如何在 Spring 项目中使用自定义注解和 Aspect 来实现日志记录功能。我们将从头开始,创建一个简单的 Spring Boot 项目,然后使用自定义注解和 Aspect 来...
Spring 自定义注解注入properties文件的值jar包,下面为使用方法 在xml配置文件中,这样加载properties文件 ...
浅谈Spring自定义注解从入门到精通 在业务开发过程中,我们经常会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求。这时,我们可以自定义注解来满足我们的需求。根据注解使用的位置,文章将...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...
本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...
使用Spring AOP和自定义注解进行参数检查 了解使用Spring AOP和自定义注解进行参数检查的技术细节。通过自定义注解和spring AOP,我们可以实现参数的校验,提高代码的可读性和可维护性。 自定义注解 在本篇文章中...
使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验
在Spring框架中,自定义注解结合AOP(面向切面编程)是实现业务逻辑与非业务逻辑分离的一种有效方式。通过自定义注解,可以针对不同的业务场景灵活地添加功能,比如权限控制、日志记录、事务管理等。本文将详细讨论...
这个机制在实际开发中有着广泛的应用,比如在微服务框架如Dubbo中,通过自定义注解可以方便地将服务提供者和服务消费者自动注册到Spring容器,简化配置,提高代码可读性和可维护性。通过理解和掌握这一机制,开发者...
### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...
Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...
Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...
在这个特定的场景中,我们探讨的是如何在Spring Boot应用中自定义注解,以及如何利用这个注解进行系统监控的开发。 首先,让我们理解什么是自定义注解。在Java中,注解(Annotation)是一种元数据,它提供了向...
本教程将探讨如何使用Java自定义注解来模拟实现这些SpringBoot相关的注解功能。 首先,我们来看`@Autowired`注解。`@Autowired`是Spring框架中的一个关键注解,用于自动装配bean。当我们想在类中注入某个依赖时,而...
自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...
在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...
在服务端开发中,如Spring框架,自定义注解可以用于简化配置,增强功能。例如,可以创建一个用于事务管理的注解: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @...