一、注解(Annotation)
是JDK5版本后加入的技术,注解相当于是提供给JVM的注释,注解不影响程序的运行。 注解可以起到一些标注的作用,也能做一些数据的配置
二、使用注解
在使用注解时,要清楚使用注解的位置,注解的属性
1. @Override注解 : 只能修饰一个方法,标注这个方法是符合重写的语法的。
2. @Deprecated注解:标注一个方法是已过时的方法
可以修饰构造器、属性、局部变量、方法、包、参数、类和接口
3. @SuppressWarnings注解:解除警告
使用注解时要指定属性的值
如果注解只有一个必要的属性,属性名是value,那么在使用注解时,value=可以省略
@SuppressWarnings({"all"})
List list = new ArrayList();
如果数组只有一个元素时,{}可以省略
@SuppressWarnings("all")
/*@SuppressWarnings({"all"})
@SuppressWarnings(value={"all"})
@SuppressWarnings(value="all")*/
List list = new ArrayList();
三、自定义注解及读取注解
当要定义一些特定功能的注解,通过自定义注解+反射实现。
所有的注解都继承于Annotation,意味着可以使用Annotation接口引用任何的注解。只要定义了@Interface就是 一个注解。
1. @Target注解:修饰一个注解,标注修饰的注解的使用位置
//@Test注解可以在类或接口 、属性上使用
@Target({ElementType.TYPE,ElementType.FIELD})
public @interface Test {
}
ElementType枚举的常用的值:
TYPE:类或接口,
FIELD:属性,
METHOD:方法,
PARAMETER:参数,
CONSTRUCTOR:构造器,
LOCAL_VARIABLE:局部变量,
ANNOTATION_TYPE:注解,
PACKAGE:包
2. @Retention注解:修饰一个注解,标注这个注解的有效范围,源码、字节码、运行时。
源码范围(Source):注解在源代码中,编译后不会存留在字节码中,例如@Override注解就是源码范围。
字节码范围(Class):注解在源码、字节码中存在,在运行时不存在。
运行时范围(Runtime) : 注解在源码、字节码、运行时都存在。
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}
3. 定义注解中的属性
定义属性语法格式:
类型 属性名 () [default 值] ;
其中类型一定是:基本类型、基本类型数组、String类型、String数组、Class类型、注解、枚举
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
int i();
String name();
int[] nums();
String[] names();
Class cls();
}
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
String name() default "tom";
String value();
}
自定义的注解本身是不具备任何功能的,仅仅是一个标注,而要实现注解的功能,其实在类中实现的注解的功能
通过反射技术,读取到注解,根据读取的注解,进行一些功能的实现
1. 修饰类的注解,使用类对象的方法读取
public static void main(String[] args) {
//获得Student的类对象
Class cls = Student.class;
//获得Student类上修饰的@Test注解中的四个属性值
Test testAnnotation = (Test)cls.getAnnotation(Test.class);
System.out.println(testAnnotation.i());
System.out.println(testAnnotation.value());
System.out.println(testAnnotation.nums());
System.out.println(testAnnotation.names());
}
2. 修饰属性的注解,使用属性对象的方法读取
public static void main(String[] args) {
//获得Student的类对象
Class cls = Student.class;
//获得Student类 id属性上 修饰的@Test注解中的四个属性值
try {
Field field = cls.getDeclaredField("id");
Test testAnnotation = (Test)field.getAnnotation(Test.class);
System.out.println(testAnnotation.i());
System.out.println(testAnnotation.value());
System.out.println(testAnnotation.nums());
System.out.println(testAnnotation.names());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
3. 方法上的注解、构造器上的注解、参数前的注解 的编程步骤,同上。
四、实现BaseDao的应用
1. 底层程序员:定义注解、实现BaseDao功能
通过注解完成VO类和表的映射配置,包括类名和表名、属性名和列名、列属性在类属性中的体现等映射配 置。
在BaseDao中实现映射功能。
2. 上层程序员:定义VO类,使用注解,调用BaseDao功能