反射学习笔记
内容
反射机制的概述和字节码对象的获取方式
反射操作构造方法、成员方法、成员属性
JavaBean的概述&BeanUtils的使用
1 反射机制概述和 常用方法
1.1 反射机制的概述和字节码对象的获取方式
1.1.1 反射介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.1.2 字节码文件获取的三种方式
对象名.getCalss(); // 次方法来自于Object 对象已经存在的情况下, 可以使用这种方式
类名.class // 类名.class这是一个静态的属性, 只要知道类名, 就可以获取
Class.forName(“com.itheima_01.Student”); // 通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
// 此处将会抛出异常都系 ClassNotFoundException 防止传入错误的类名
1.2 反射操作构造方法
1.2.1 通过获取的构造创建对象
步骤:
1.获得Class对象
2获得构造
3.通过构造对象获得实例化对象
Class的成员方法:
getConstructor(Class...objs) -> Constructor
getConstructors() -> Constructor[]
getDeclaredConstructor(Class...objs) -> Constructor
getDeclaredConstructors() -> Constructor[]
newInstance() -> Object
Constructor成员方法
newInstance(Object...objs) -> Object
1.2.2 问题: 直接通过Class类中的newInstance()和获取getConstructor()有什么区别?
newInstance()方法, 只能通过空参的构造方法创建对象
getConstructor(Class… parameterTypes)方法, 方法接受一个可变参数, 可以根据传入的类型来匹配对应的构造方法
1.3 反射操作公共成员变量
1.3.1 反射public成员变量(字段)
通过反射运行public变量流程
通过反射获取该类的字节码对象
Class clazz = Class.forName(“com.heima.Person”);
创建该类对象
Object p = clazz.newInstance();
获取该类中需要操作的字段(成员变量)
getField(String name) --> 方法传入字段的名称.
注意: 此方法只能获取公共的字段
Field f = clazz.getField(“age”);
通过字段对象中的方法修改属性值
void set(Object obj, Object value) --> 参数1): 要修改那个对象中的字段, 参数2): 将字段修改为什么值.
f.set(p, 23);
1.3.2 方法总结
通过反射获取成员变量并使用
Field[] getFields() --> 返回该类所有(公共)的字段
Field getField(String name) --> 返回指定名称字段
Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
1.4 反射操作私有成员变量
Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
void setAccessible(boolean flag) --> 让jvm不检查权限
1.5 通过反射获取成员方法并使用
Class的成员方法:
getMethod() -> Method
getMethods() -> Method[] 获取自己的以及从父类或父接口中继承/实现过来的public修饰的成员方法对象
getDeclaredMethod() -> Method
getDeclaredMethods() -> Method[] 获取的自己的任意修饰符修饰的成员方法对象
Method的成员方法:
invoke(Object obj,Object...params) -> Object
2 JavaBean的概述、BeanUtils的使用
2.1 JavaBean的概述和规范
JavaBean的概述:
将需要操作的多个属性封装成JavaBean, 简单来说就是用于封装数据的
规范:
类使用公共进行修饰
提供私有修饰的成员变量
为成员变量提供公共getter和setter方法
提供公共无参的构造
2.2 BeanUtils
2.2.1 准备工作
- 导入两个jar包
commons-beanutils.jar
commons-logging.jar - 将jar包Build path 配置到当前的classpath环境变量中
2.3 BeanUtils的常用方法
static void setProperty(Object bean, String name, Object value)
static String getProperty(Object bean, String name)
static void populate(Object bean, Map properties)
setProperty 用来给对象中的属性赋值(了解)
参数1: 需要设置属性的对象
参数2: 需要修改的属性名称
参数3: 需要修改的具体元素
getProperty 用来获取对象中的属性(了解)
参数1: 要获取的javaBean对象
参数2: 对象中的哪个属性
Populate 用来给对象中的属性赋值(掌握)
参数1: 要设置属性的对象
参数2: 将属性以Map集合的形式传入
Key : 属性的名称
Value: 属性具体的值
小结
获取字节码文件对象
1:对象名.getClass()
2:类名.class属性
3:Class.forName("包名.类名")
获取构造方法
Class的成员方法:
getConstructor(Class...objs) -> Constructor
getConstructors() -> Constructor[]
getDeclaredConstructor(Class...objs) -> Constructor
getDeclaredConstructors() -> Constructor[]
newInstance() -> Object
Constructor成员方法
newInstance(Object...objs) -> Object
获取成员变量
Class的成员方法:
getField() -> Field
getFields() -> Field[]
getDeclaredField("age") -> Field
getDeclaredFields() -> Field[]
Field的成员方法
set(Object obj,Object value)
get(Object obj) -> Object
获取成员方法
Class的成员方法:
getMethod() -> Method
getMethods() -> Method[] 获取自己的以及从父类或父接口中继承/实现过来的public修饰的成员方法对象
getDeclaredMethod() -> Method
getDeclaredMethods() -> Method[] 获取的自己的任意修饰符修饰的成员方法对象
Method的成员方法:
invoke(Object obj,Object...params) -> Object
定义Javabean规范
BeanUtils工具类的使用
setProperty(Object bean,String name,Object value)
getProperty(Object bean,String name)
populate(Object bean,Map m)