注解:给程序带上一些标记,从而影响编译器运行程序的结果!!!
注释:提高程序的可读性,对程序运行没有影响!!!
注解的作用:
1)可以在程序上(类,方法,属性)携带信息
2)注解简化(取代)配置文件(xml或properties)
每个框架都有两种方案:
1)把参数放在xml文件中
2)把参数放在注解中
1、常见的注解
/**
* 1)告诉编译器强制对方法进行覆盖
*/
@Override
public String toString() {
return super.toString();
}
/**
* 2)告诉编译器压制代码中出现的警告
* @return
*/
@SuppressWarnings(value = { "unchecked" })
public List save(){
List list = new ArrayList();
return list;
}
/**
* 3)在运行时让方法提示过期
*/
@Deprecated
public void update(){
}
2、定义注解语法
public @interface Author {
}
3、带有属性的注解
public @interface Author {
//声明属性
String name();
String modifyTime();
}
4、注解细节
1)属性的类型可以基本数据类型。也可以是数组类型
2)使用default关键子给注解一个默认值
3)当注解中使用value名称的属性,则可以省略“value=”不写
public @interface Author {
//声明属性
String name();
String modifyTime() default "2015-06-25";//给属性带上默认值
String[] address();//带有数组类型的属性
//如果注解的属性名称为value,那么在使用注解的时候可以不写value=
String[] value();
//String[] names();
//String value();
}
5、元注解
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
声明注解的使用范围.
TYPE: 注解可以用在类上
FIELD:注解可以用在属性上
METHOD:用在方法上
PARAMETER:用在参数声明上面
CONSTRUCTOR:用在构造方法上面
LOCAL_VARIABLE:用在本地变量上面
@Retention(RetentionPolicy.SOURCE)
声明注解的有效范围
RetentionPolicy.SOURCE: 该注解只在源码中有效!
RetentionPolicy.CLASS: 该注解在源码中,和字节码中有效!(默认)
RetentionPolicy.RUNTIME: 该注解在源码中,和字节码中有效,运行字节码的时候有效!
6、反射注解
使用反射技术获取(类,方法,属性)注解的信息
//1)得到save方法对象
Method m = this.getClass().getMethod("save", null);
//2)得到方法上面的注解
Author author = m.getAnnotation(Author.class);
System.out.println(author);
//3)获取注解里面的属性(数据)
String name = author.name();
String time = author.modifyTime();
System.out.println(name);
System.out.println(time);
7、 反射注解的案例(重点)
改造泛型DAO的案例:
问题: 当具体的实体类对象的属性和表的字段不一致时,BaseDao就无法使用了!!这时需要使用注解绑定类和表名,属性和字段的关系。改造后的实体对象如下
/**
* 表的注解
* @author APPle
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name();//数据的表名
}
/**
* 字段的注解
* @author APPle
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name();//字段名称
}
@Table(name = "teacher_list")
public class Teacher {
@Column(name = "tid")
private int id;
@Column(name = "tname")
private String name;
@Column(name = "tage")
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}