1.6. 注解与注解处理器

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

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

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

自定义注解:

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

}

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

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

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

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

二. 自定义注解

注解以@开头
在idea中new一个自定义注解

image.png|500

自定义注解的依法格式:

【修饰符列表】 @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());
        }
    }
}

测试结果:

image.png|700

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇