第一节 复习
反射技术 :
Class类 --》反射技术的入口
a)如何获取一个类的Class对象 , 最常用的方式Class.forName(“完整的包名+类名”);
举例:Class.forName(“com.mysql.jdbc.Driver”);
b)Class是所以使用class声明的数据类型[类类型]的模板
一个类需要具备 1)属性 2)方法 3)构造方法
使用Class对象获取任意一个类的属性 -->属性对象 Field 对象
使用Class对象获取任意一个类的方法 --> 方法对象 Method对象 ,在Method类有一个非常重要的方法 invoke (…)
使用Class对象获取任意一个类的构造方法 -->构造方法对象 Constructor 对象,在,Constructor类有一个非常重要的方法 newInstance().,用于创建类的对象
第二节 注解
2.1 注解的简介
注解的作用
①不是程序本身,可以对程序作出解释。(这一点跟注释没什么区别)
②可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义)
注解的格式
注解是以”@注释名”在代码中存在,还可以添加一些参数值,例如@SuppressWarnings(value=”unchecked”)。
注解在哪里使用
可以附加在package,class,method,field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。
内置的注解
①@Override :标识方法是重写的方法
② @Deprecated :标识的方法不建议使用
③ @SuppressWarnings:用来抑制编译时的警告信息
④@SuppressWarinings需要提供参数才能正常使用,这些参数都是已经定义好的,我们只需要选择就可以了。
举例:
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})
自定义注解的语法
使用@interface定义自定义注解时,自动继承了java.lang.annotation.Annotation接口
【1】@interface 用来声明一个注解
【2】其中的每一个方法实际上是声明了一个配置参数
◆ 方法的名称就是参数的名称
◆ 返回值类型就是参数类型(返回值类型只能是基本类型、Class、String、enum)
◆ 可以通过default来声明参数的默认值
◆ 如果只有一个成员,一般参数名为value
注意事项:注解元素必须要有值。我们定义注解元素时,经常使用空字符串,0作为默认值。
也经常使用负数(比如-1)表示不存在的含义
元注解
元注解的作用就是负责注解其他注解。在Java中定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明
这些类型和它们所支持的类在java.lang.annotation包中可以找到
◆@Target
◆@Retention
◆@Documented
◆@Inherited
@Target
作用:用于描述注解的使用范围(即被描述的注解可以用在什么地方)
@Retention
作用:表示需要在什么级别保存该注解信息,用于描述注解的生命周期
2.2 自定义注解及使用
自定义注解
package com.bjsxt.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
/**
* 自定义注解
*/
@Target({
TYPE,METHOD,FIELD}) //@Target说明自定义注解MyAnnotation 的适用范围 是类,接口,。。方法,属性
@Retention(RUNTIME) //@Retention说明自定义的的注解MyAnnotation的使用时机,是程序运行时
public @interface MyAnnotation {
String value();//注解的参数
}
使用注解 (将注解应用到类上,属性上,方法上)
package com.bjsxt.annotation;
/**
*给MyUser类添加注解
*/
@MyAnnotation(value = "这是一个用户类") //在类上使用注解
public class MyUser {
@MyAnnotation(value = "用户编号") //在属性上使用注解
private String uid;
@MyAnnotation(value = "这是一个显示用的方法") //在方法上使用注解
public void show(){
}
}
使用反射技在程序运时读取注解
package com.bjsxt.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import static java.lang.Class.forName;
/**
* 使用反射技术在程序运行时读取注释
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Class aClass = forName("com.bjsxt.annotation.MyUser");
//
Annotation[] annotations = aClass.getAnnotations();
for (Annotation annotation:annotations) {
Class aClass1 = annotation.annotationType();
System.out.println("注解的类名称"+aClass1.getName());
}
System.out.println("-----------------------我是分割线---------------------------");
MyAnnotation annotation1 = (MyAnnotation) aClass.getAnnotation(MyAnnotation.class);
System.out.println("注解上注解的参数值"+annotation1.value());
//
Field[] fields = aClass.getDeclaredFields();
for (Field field:fields) {
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
System.out.println("属性上的注解"+annotation.value());
}
//
Method show = aClass.getDeclaredMethod("show");
MyAnnotation annotation = show.getAnnotation(MyAnnotation.class);
System.out.println("注解的参数值"+annotation.value());
}
}
2.3 课堂案例_反射读取注解信息
有一个Java类名称为Student,使用ORM思想(类和表对应,属性和字段对应,对象和数据行对应)使用注解完成类和表结构的映射关系,在类上使用注解,在程序运行时,通过反射读取注解,在数据库中创建Student类对应的数据表tb_student。
操作步骤
(1)创建Student类
(2)编写注解
a)编写应用在Student类上的注解 ,后期用于数据库中表的名称
b)编写应用在Student类上的属性上的注解,后期用于数据库表中的字段
【一个字段由三部分组成,名称,数据类型,长度】
(3)在Student类和属性上应用注解
(4)准备jdbcutil和jar包
(5)写测试,使用反射读取注解
使用注解完成类和表结构的映射关系,怎么映射呀?发现表名和类名是不对等的,字段名和属性名也有可能对不上,怎么办?就需要使用注解来让他们对应起来。那么我们就做这样一件事情:将java当中Student类使用使用第三方程序(就是我们写的程序)用过读取注解在数据库中创建一张表出来。(也就是在java中有一个Student类,在Student类中使用注解,在程序运行的时候,使用反射读取注解,到数据库当中,把这个表创建出来)
【1】创建Student类
package com.bjsxt.deno;
/**
*bean类
*/
public class Student {
private int stuId;
private String stuName;
private int age;
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this