前言
java的注解,我们都在使用,尤其是框架学习的部分,注解尤为重要,那么注解究竟有什么魅力?它在程序运行当中又是如何起作用,如何理解注解的存在!相关资料会告诉我们,注解是解释程序、说明程序的!那么它又是如何解释,说明程序的?还有注解里的参数,你有没有好奇过它究竟去了?下面作以演示说明
注解
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
反射
- JAVA反射机制是在运行状态中,获取任意一个类的结构 , 创建对象 , 得到方法,执行方法 , 属性 !
- 反射:框架设计的灵魂
- 将类的各个组成部分封装为其他对象,这就是反射机制
反射给予注解生命:
下面通过自定义注解(模拟在数据库的映射),演示注解的存在价值,注解参数的去向:
- 定义注解(数据库注解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();
}
- 定义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 + '\'' +
'}';
}
}
- 注解的生命,正是利用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());
}
}
}
运行结果:
总结
注解就是利用反射,获取注解的信息以及参数,然后拿到参数值或者注解类型,来进行一些操作,这样注解以及注解的参数等信息就有了它的使用价值!