java之注解详解

一、注解如何定义?怎么用?

注解,或者说叫做注释类型,英文单词是:Annotation

注解Annotation是一种引用数据类型。编译之后也是生成XXX.class文件。

自定义注解:

[修饰符列表] @interface 注解类型名{
    
    

}

注解怎么使用,用在什么地方?

  • 第一:注解使用时的语法格式是:@ 注解类型名
  • 第二:注解还可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上。

JDK内置了哪些注释?
java.lang包下的注释类型:

  • 掌握:Deprecated,用@Deprecated注释的程序元素。不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
  • 掌握:Override,表示一个方法声明打算重写超类的另一个方法声明。
  • 不用掌握:SuppressWarnings,指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。

二、自定义注解

注解以@开头
在idea中new一个自定义注解
在这里插入图片描述

自定义注解的依法格式:

【修饰符列表】 @interface 注解名称{…}

public @interface FirstAnnotation {
    
    
}

使用注解:@注解名称 如:@Override

@MyAnnotation
public class Person {
    
    
}

三、Override注解

关于JDK lang包下的Override注解
源代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
    
    
}
  • @Override只能注解方法。
  • @Override这个注解是给编译器参考的,和运行阶段没有关系
  • 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。

四、元注解

1、什么是元注解?

用来标注”注解类型的"注解"。称为元注解

2、常见的元注解有哪些?

  • Target
  • Retention

3、关于Target注解:

这是一个元注解,用来标注"注解类型”的注解"
这个Target注解用来标注"被标注的注解"可以出现在哪些位置上
@Target (ElementType .METHOD):表示w被标注的注解只能出现在方法上.

4、关于Retention注解:

这是一个元注解,用来标注"注解类型”的"注解"
这个Retention注解用来标注"被标注的注解"最终保存在哪里

@Retention(RetentionPolicy .SOURCE):表示该注解只被保留在java源文件中。@Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件
@Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以

五、Deprecated注解

表示已过时的。

源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={
    
    CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
    
    
}

六、使用反射获取注解信息

需求:创建一个自定义注解,在Person类上及Person的方法上使用注解,在测试类中通过反射获取标注在Person类和方法上的注解信息。

注意:自定义注解必须用@Retention(RetentionPolicy.RUNTIME)标注,这样自定义注解才能被反射机制读取到。

@Retention(RetentionPolicy.RUNTIME)
public @interface PersonInfo {
    
    
    int age();
    String name();
}
@PersonInfo(age=20,name="张三")
public class Person {
    
    

    @PersonInfo(age=30,name="李四")
    public void eat(){
    
    
        System.out.println("run方法执行了.....");
    }
}

测试类:

import java.lang.reflect.Method;

public class ReflectPersonInfo {
    
    
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
    
    
        //获取Person类对象
        Class<?> aClass = Class.forName("cn.itcast.annotation.Person");

        //获取标注在Person类上的@PersonInfo注解信息
        if(aClass.isAnnotationPresent(PersonInfo.class)){
    
        //判断Person类上是否有@PersonInfo注解标注
            //获取注解对象
            PersonInfo personInfo = aClass.getAnnotation(PersonInfo.class);

            //打印标注在Person类上的@PersonInfo注解信息
            System.out.println(personInfo.age());
            System.out.println(personInfo.name());
        }

        System.out.println("----------------------------");
        
        //获取标注在Person类的方法上的@Person注解信息
        Method eat = aClass.getDeclaredMethod("eat");   //获取Person类的eat方法对象
        if(eat.isAnnotationPresent(PersonInfo.class)){
    
            //判断Person类的eat方法上是否有@PersonInfo注解标注
            //获取标注在eat方法上的注解对象
            PersonInfo personInfo = eat.getAnnotation(PersonInfo.class);

            //打印标注在Person类中的eat()方法上的注解信息
            System.out.println(personInfo.name());
            System.out.println(personInfo.age());
        }
    }
}

测试结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq2632246528/article/details/115010409
今日推荐