41..反射:
在运行时,我们可以获取任意一个类的所有方法和属性
在运行时,让我们调用任意一个对象的所有方法和属性
(前提:)要获取类的对象(Class对象(字节码对象))
42..字节码文件获取的三种方式
1.对象名.getCalss(); // 次方法来自于Object 对象已经存在的情况下, 可以使用这种方式
2.类名.class // 类名.class这是一个静态的属性, 只要知道类名, 就可以获取
3.Class.forName(“com.itheima_01.Student”); // 通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
// 此处将会抛出异常都系 ClassNotFoundException 防止传入错误的类名
字节码对象是用来描述什么的? 用来描述.class文件的,
面向对象阶段的时候讲过java中描述事物都是通过类的形式,而字节码文件也可以看做为一种事物, 如何描述这种事物?那就看看这个事物是由什么组成的了::1. 成员变量 2. 成员方法3. 构造方法
43.通过反射获取构造方法并使用
newInstance()方法, 只能通过空参的构造方法创建对象::获取该类中所有的构造方法, 返回的是一个数组
getConstructor(Class<T>… parameterTypes)方法, 方法接受一个可变参数, 可以根据传入的类型来匹配对应的构造方法::方法接受一个可变参数, 可以根据传入的类型, 来匹配对应的构造方法
注意:泛型只是作用于编译阶段,运行时会被擦除
44.通过反射获取成员变量并使用:
前提: //获取学生类的字节码对象
Class clazz = Class.forName("com.itheima_01.Student");
//获取学生类的对象
Object stu = clazz.newInstance();
45..方法总结
通过反射获取成员变量并使用
Field[] getFields() --> 返回该类所有(公共)的字段
Field getField(String name) --> 返回指定名称字段
Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
Field:
Object get(Object obj) --> Field对象调用, 返回传入对象的具体字段
void set(Object obj, Object value) --> Field对象调用
参数1: 要修改的对象
参数2: 将此对象的字段修改为什么值.
Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
void setAccessible(boolean flag) --> 让jvm不检查权限
Class:
Method getMethod(String name, Class<?>... parameterTypes)
// 此方法由字节码对象调用
// 参数1: 要反射的方法名称
// 参数2: 此方法需要接受的参数类型(注意,传入的都是字节码)
Method:
Object invoke(Object obj, Object... args)
// 方法由Method对象调用
// 参数1: 要由那个对象调用方法
// 参数2: 方法需要的具体实参(实际参数)
46.JavaBean的概述:将需要操作的多个属性封装成JavaBean, 简单来说就是用于封装数据
规范:
类使用公共进行修饰
提供私有修饰的成员变量
为成员变量提供公共getter和setter方法
提供公共无参的构造
实现序列号接口(可以被写到文件中,可以被持久化存储)
47.BeanUtils的由来:之前我们使用的类都是来自Java编写好的源代码,而这个BeanUtils却是一个叫做Apache的组织编写,那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率,这个系列为Commons, BeanUtils就是其中之一
只能给符合Javabean规范的类赋值
48.BeanUtils的常用方法
A.setProperty 用来给对象中的属性赋值(了解)
static void setProperty(Object bean, String name, Object value)
参数1: 需要设置属性的对象
参数2: 需要修改的属性名称
参数3: 需要修改的具体元素
B.getProperty 用来获取对象中的属性(了解)
static String getProperty(Object bean, String name)
参数1: 要获取的javaBean对象
参数2: 对象中的哪个属性
C.Populate 用来给对象中的属性赋值(掌握)
static void populate(Object bean, Map properties)
参数1: 要设置属性的对象
参数2: 将属性以Map集合的形式传入
Key : 属性的名称
Value: 属性具体的值
注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法;三个方法底层是通过反射实现, 而且反射操作的是setXxx方法和getXxx方法,所以编写JavaBean的时候一定要注意格式
可以通过类的字节码对象直接得到类的对象
Class<?> clazz = Class.forName("Homework02.Person");
//直接通过字节码对象得到类的对象
Object obj1 = clazz.newInstance(); |
|