【动力节点 Java进阶学习笔记】第九章 注解

【动力节点 Java进阶学习笔记】第九章 注解

      • 1、什么是注解、注解的作用,以及如何自定义注解和使用注解
      • 2、内置注解:Deprecated和Override
      • 3、元注解:Target和Retention
      • 4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性
      • 5、反射注解
      • 6、反射在开发中的作用示例

1、什么是注解、注解的作用,以及如何自定义注解和使用注解

  • 注解的定义
           注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理
           注解Annotation是一种引用数据类型
  • 注解的作用
           编写文档:通过代码里标识的元数据生成文档。
           代码分析:通过代码里标识的元数据对代码进行分析,替代配置文件。
           编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
  • 自定义注解
    [修饰符列表]   @interface   注解类型名{}
  • 注解使用
           使用方法:@注解类型名
           使用位置:注解可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上

2、内置注解:Deprecated和Override

       Override注解:只能注解方法,编译器会自动检查该方法是否重写了父类的方法
       Deprecated注解:表示已废弃、暂时可用,不建议使用

3、元注解:Target和Retention

  • 元注解的定义:用来标注“注解类型”的“注解”,称为元注解。
  • Target注解
           用来标注“被标注的注解”可以出现在哪些位置上。
           @Target(ElementType.METHOD)
  • Retention注解
           用来标注“被标注的注解”最终保存在哪里
           @Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
           @Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
           @Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被反射机制所读取。

4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性

  • 格式:<数据类型> <数据类型名>()        如:String name()
  • 使用default指明默认值:<数据类型> <数据类型名>() default <数据值>       如:String name() default “bob”
  • 如果一个注解的属性的名字是value,并且只有一个属性的话,在使用的时候,该属性名可以省略。
  • 属性的类型可以是:基本数据类型、 String、Class、枚举类型以及它们的数组形式

5、反射注解

  • 前提:元注释Retention属性设置为RUNTIME
  • 判断是否存在某注解isAnnotationPresent(注解.class);如:c.isAnnotationPresent(MyAnnotaion2.class)
  • 获取某注解getAnnotation(注解.class);如:MyAnnotaion2 at = (MyAnnotaion2)c.getAnnotation(MyAnnotaion2.class)
  • 获取该注解中的属性:<注解类型对象>.<属性名()> ;如:myAnnotation.value()

6、反射在开发中的作用示例

自定义注解,表明必须有ID这个属性

package com.javalearn.javase.review.annotation.annotation3;

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 MustHasIdPropertyAnnotation {
}

自定义异常,当使用自定义注解但是未定义ID属性时抛出该异常

package com.javalearn.javase.review.annotation.annotation3;

public class HasNotIdPropertyException extends RuntimeException{
    public HasNotIdPropertyException() {
    }

    public HasNotIdPropertyException(String s) {
        super(s);
    }
}

定义使用自定义注解的User类

package com.javalearn.javase.review.annotation.annotation3;

@MustHasIdPropertyAnnotation
public class User {
//    int id;
    String id;
    String name;
    String password;
}

编写测试程序进行测试

package com.javalearn.javase.review.annotation.annotation3;

import java.lang.reflect.Field;

public class AnnotationTest {
    public static void main(String[] args) {
        Class c = null;
        try {
             c = Class.forName("com.javalearn.javase.review.annotation.annotation3.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (c.isAnnotationPresent(MustHasIdPropertyAnnotation.class)) {
            Field[] fields = c.getDeclaredFields();
            boolean isOk = false;
            for (Field field:fields) {
                if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) {
                    isOk = true;
                    break;
                }
            }
            if (!isOk) {
                throw new HasNotIdPropertyException("被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!");
            }
        }
    }
}

此时运行结果为:

Exception in thread "main" com.javalearn.javase.review.annotation.annotation3.HasNotIdPropertyException:@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!
	at com.javalearn.javase.review.annotation.annotation3.AnnotationTest.main(AnnotationTest.java:23)

Process finished with exit code 1

你可能感兴趣的:(Java学习,java,学习,开发语言)