Java的注解有什么用?反射给予注解生命

886 阅读3分钟

前言

   java的注解,我们都在使用,尤其是框架学习的部分,注解尤为重要,那么 注解究竟有什么魅力?它在程序运行当中又是如何起作用,如何理解注解的存在! 相关资料会告诉我们,注解是解释程序、说明程序的!那么它又是如何解释,说 明程序的?还有注解里的参数,你有没有好奇过它究竟去哪了?下面作以演示说明。

注解

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

反射

  • JAVA反射机制是在运行状态中,获取任意一个类的结构 , 创建对象 , 得到方法,执行方法 , 属性 !
  • 反射:框架设计的灵魂
  • 将类的各个组成部分封装为其他对象,这就是反射机制

反射给予注解生命:

  下面通过自定义注解(模拟在数据库的映射),演示注解的存在价值,注解参数的去向:

  1. 定义注解(数据库注解TableAnnotation,字段注解ColumnAnnotation) TableAnnotation
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TableAnnotation {
    String value();//一个方法的时候,默认用value为名,注解时可不加方法名
}

ColumnAnnotation

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ColumnAnnotation {
    /**
     * 列名
     * @return
     */
    String columnName();

    /**
     * 字段类型
     * @return
     */
    String type();

    /**
     * 字段长度
     * @return
     */
    String length();
}
  1. 定义java类 Book来使用注解,作用是声明数据库名以及字段属性等信息 Book.java
@TableAnnotation("test_Book")//用value为名,注解时可不加方法名
public class Book{
    @ColumnAnnotation(columnName = "id",type = "int",length = "10")
    private int id;
    @ColumnAnnotation(columnName = "name",type = "varchar",length = "20")
    private String name;
    @ColumnAnnotation(columnName = "info",type = "varchar",length = "25")
    private String info;

    public Book() {}

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return id == book.id &&
                Objects.equals(name, book.name) &&
                Objects.equals(info, book.info);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, info);
    }
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
}
  1. 注解的生命,正是利用java的反射机制,来获取注解信息,以达到使用目的! 创建测试类来利用反射,获取Book类的注解生命!
public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException {
        //加载类,获取Class对象
        Class bk = Class.forName("com.kkb.Demo3.Book");
        //获取构造方法
        TableAnnotation annotation = (TableAnnotation) bk.getAnnotation(TableAnnotation.class);
        //获取类注解的注解信息
        String value = annotation.value();
        System.out.println(value);
        System.out.println("===============================");
        
        //获取属性注解的注解信息
        Field[] fields = bk.getDeclaredFields();
        for (Field f:fields) {
            ColumnAnnotation ca = f.getAnnotation(ColumnAnnotation.class);
            System.out.println(f.getName()+"属性,对应的字段:"+ca.columnName()+",数据类型是"+ca.type()+",长度是"+ca.length());
        }
    }
}

运行结果: 在这里插入图片描述

总结

  注解就是利用反射,获取注解的信息以及参数,然后拿到参数值或者注解类型,来进行一些操作,这样注解以及注解的参数等信息就有了它的使用价值!