反射

任务

 

目标

 

第一节:可变参数

从JDK 5开始,Java 允许为方法定义长度可变的参数。

语法:

public void foo(int … args){ //int...表示数组

}

注意事项:

案例一:

 

第二节:反射

2.1 为什么使用反射
 
2.2 什么是反射
反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
2.3 反射常用类
2.4 使用反射的基本步骤

​ 1.导入java.lang.reflect.*

​ 2.获得需要操作的类的Java.lang.Class对象

​ 3.调用Class的方法获取Field、Method等对象

​ 4.使用反射API进行操作(设置属性﹑调用方法)

第三节:Class类

3.1 Class类是反射机制的起源和入口
3.2 Class类存放类的结构信息
3.3 获取 Class对象的方式

第一种方式

//方法1:对象.getClass()
Student stu=new Student();
Class clazz=stu.getClass();

第二种方式

//方法2:类.class
clazz= Student.class;
clazz=String.class;

第三种方式

//方法3:Class.forName()
clazz=Class.forName("java.lang.String");
clazz=Class.forName("java.util.Date");

3.4 获取类的其他结构信息
 
3.5 动态创建对象

方法一:使用Class的newInstance()方法,仅适用于无参构造方法

 

方法二:调用Constructor的newInstance()方法,适用所有构造方法

 

练习一:

1 定义Student类,包含:姓名和年龄等属性,有参和无参构造方法,输出所有信息的方法

2 使用多种方法生成一个Student类的Class对象

3 使用Class类获取Student类的属性并输出

4 通过有参(无参)构造方法动态创建Student类的对象

3.6 动态执行方法

调用方法基本步骤:

1.通过Class对象获取Method 对象

2.调用Method对象的invoke()方法

例如:

 

3.7 反射动态操作属性值

操作属性的基本步骤

1.通过Class对象获取Field 对象

2.调用Field 对象的方法进行取值或赋值操作

方法说 明
Xxx getXxx(Object obj)获取基本类型的属性值
Object get(Object obj) )得到引用类型属性值
void setXxx(Object obj,Xxx val)将obj对象的该属性设置成val值
void set(Object obj,object val)将obj对象的该属性设置成val值
void setAccessible(bool flag)对获取到的属性设置访问权限

第四节:反射技术的优点和缺点

优点:

​ 1.提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力

​ 2.允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点:

​ 1.性能问题

​ 2.代码维护问题

第五节:综合案例

 

第七节:默写:

1获取类对象的三种方式

第八节:作业:

1 设计一个Student类,属性有:id,name,age,borndate,使用反射创建对象。

2 使用反射调用方法show显示学生信息。

3 使用反射调用name属性。

第九节:面试题:

1 简述Java中的反射使用

2 JAVA常用反射API