java的注解是个什么玩意

什么是注解

通常情况下,程序员对一组数据进行操作时常会使用json或xml。在使用json时,大部分情况下会定义一个实体类,类中有各种字段来描述json中的key;在使用xml时,也会定义一个DTD来描述xml中可以有哪些key。

 

注解的作用也是类似,注解就是描述一组数据、定义数据类型的一个对象。使用 @interface 可以定义一个注解,注解中的属性类型只支持String、基本数据类型和枚举

 

注解的使用

注解本身不包含任何业务逻辑,通常需要使用反射机制获得使用了某一个注解的那些元素,从而进行一些逻辑处理

 

定义MyTag注解

package com.helianxiaowu.springclouddemo.annotation;import java.lang.annotation.*;@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MyTag {    String value() default "";}

 

使用MyTag注解

package com.helianxiaowu.springclouddemo.annotation;

import java.lang.reflect.Method;

/**
 * 使用注解demo
 */
public class AnnotationDemo {

    public static void main(String[] args) {
        // 反射获取所有的方法
        Class<AnnotationDemo> annotationDemoClass = AnnotationDemo.class;
        Method[] methods = annotationDemoClass.getDeclaredMethods();

        // 循环所有方法判断哪些使用了注解
        for (Method method : methods) {
            if (method.isAnnotationPresent(MyTag.class)) { // 是否使用了注解
                MyTag annotation = method.getAnnotation(MyTag.class);
                System.out.printf("%s方法使用了注解,注解value是:%s。\r\n", method.getName(), annotation.value());
            } else {
                System.out.printf("%s方法没有使用注解。\r\n", method.getName());
            }

        }
    }

    @MyTag("test1Annotation")
    public void test1() {

    }

    public void test2() {

    }
}

运行main方法,得到结果如下

 

到这里是不是就能明白spring-boot使用@Value读取配置参数的基本原理,那不妨自己深入想一下@SpringBootApplication是怎么实现的

 

四个基本元注解

在自定义注解时通常要加上四个基本的元注解,其中前两个最常用。分别是:@Target、@Retention、@Documented、@Inherited

 

@Target 表示注解用在什么地方,主要有以下几种类型可选,可以同时选多

ElementType.TYPE:可以用在类、接口、枚举、注解上ElementType.FIELD:用在类的全局变量或枚举的常量上ElementType.METHOD:用在方法上ElementType.PARAMETER:用在参数上ElementType.CONSTRUCTOR:用在构造器上ElementType.LOCAL_VARIABLE:用在局部变量上ElementType.ANNOTATION_TYPE:用在另一个注解上ElementType.PACKAGE:用在pacakge上

 

@Retention 表示注解的生命周期,有以下类型可选

RetentionPolicy.SOURCE:在编译时生效RetentionPolicy.CLASS:在类加载时生效RetentionPolicy.RUNTIME:在运行时生效

 

@Documented 是一个标记注解,没有实际值可选。表示是否将注解信息添加到javadoc中,可以被javadoc之类的工具文档化

 

@Inherited 表示父类的注解可以被子类继承

 

经验小结

注解中被定义成value的属性,在使用时可以不再指定属性类型

 

可以使用defalut给注解的属性设置默认值,没有给定默认值的属性,在使用时必须给该属性赋值

 

注解和接口类似,定义的方法都是抽象方法,而且默认是  public abstract 修饰的,不同的是注解的抽象方法可以指定默认值

 


扫码关注我的公众号

每天进步一点点,不负光阴,度几扶人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值