Java基础--注解

一、 什么是注解

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。通俗地讲,就是符合一定格式的语法。

作用
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
目前最主流的应用是代替配置文件。

优缺点
开发效率高,成本低;
耦合性大,并且不利于后期维护。


二、基本内置注解
1. @Override
帮助开发人员检查是否正确覆盖了父类方法。JDK5表示覆写父类的方法,JDK6还可以表示实现接口的方法。
2. @Deprecated
表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
注:一般被标记过时的方法都存在不同的缺陷:安全问题、新的API取代。
3. @SuppressWarnings
表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略。
deprecation 忽略过时
rawtypes 忽略类型安全
unused 忽略不使用
unchecked 忽略安全检查
null 忽略空指针
all 忽略所有


三、自定义注解

public @interface MyAnno{
    //注解的属性
    String value();
}

注解内的属性类型只有以下几种:
String、基本类型、枚举类型、注解类型、Class类型、以上类型的一维数组类型

注解使用的注意事项:
(1)注解可以没有属性,如果有属性,需要使用小括号括住。如:@MyAnno @MyAnno()
(2)属性格式:属性名=属性值,多个属性使用逗号分隔。如@MyAnno(name=”ztq”, age=”18”)
(3)如果属性名为value,且当前只有一个属性,那么value可以省略
(4)如果使用多个属性时,k的名称为value不能省略
(5)如果属性类型为数组,设置内容格式为{1, 2, 3}。如:@MyAnno(arrs = {“lisa”, “Jack”})
(6)如果属性类型为数组,且元素只有一个时,{}可以省略
(7)一个对象上,注解只能使用一次,不能重复使用。

给类、方法等添加注解,如果需要在获得注解上设置的数据,那么我们就必须对注解进行解析,JDK提供java.lang.reflect.AnnotatedElement接口,允许在运行时通过反射获得注解。

元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
JDK提供4种元注解:
(1)@Retention 用于确定被修饰的自定义注解的生命周期

  • RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
  • RetentionPolicy.CLASS被修饰的注解只能存在于源码和字节码中,运行时内存中没有。用途:JVM使用。
  • RetentionPolicy.RUNTIME被修饰的注解存在于源码、字节码、内存(运行时)中。用途:取代xml配置

(2)@Target 用于确定被修饰的自定义注解的使用位置

  • ElementType.TYPE 修饰类、接口
  • ElementType.CONSTRUCTOR 修饰构造
  • ElementType.METHOD 修饰方法
  • ElementType.FIELD 修饰字段

(3)@Documented 使用JavaDoc生成API文档时,包含此注解。
(4)@Inherited 如果父类使用被修饰的注解,子类继承。


定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
    String name();
    int age() default 18;
}

使用注解:

public class MyAnnoTest {
    @MyAnno(name = "ztq")
    public void show(){
        System.out.println("show running!");
    }
}

解析注解:

public class MyAnnoParser {
    public static void main(String[] args) {
        /*
        解析show方法上面的@MyAnno
        主要目的就是获得show方法上的@MyAnno中的参数
         */

        //获得show方法的字节码对象
        Class clazz = MyAnnoTest.class;
        try {
            Method method = clazz.getMethod("show", null);
            //获得show方法上的@MyAnno
            MyAnno annotation = method.getAnnotation(MyAnno.class);
            //获得注解的属性值
            System.out.println(annotation.name());  //ztq
            System.out.println(annotation.age());  //18
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值