反射学习笔记

反射学习笔记


内容

反射机制的概述和字节码对象的获取方式

反射操作构造方法、成员方法、成员属性

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.通过构造对象获得实例化对象

1
2
3
4
5
6
7
8
9
10
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 方法总结

1
2
3
4
5
6
 通过反射获取成员变量并使用  
Field[] getFields() --> 返回该类所有(公共)的字段
Field getField(String name) --> 返回指定名称字段

Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段

1.4 反射操作私有成员变量

1
2
3
Field[] getDeclaredFields()     --> 暴力反射获取所有字段(包括私有) 
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
void setAccessible(boolean flag) --> 让jvm不检查权限

1.5 通过反射获取成员方法并使用

1
2
3
4
5
6
7
8
9
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 准备工作

  1. 导入两个jar包
    commons-beanutils.jar
    commons-logging.jar
  2. 将jar包Build path 配置到当前的classpath环境变量中

2.3 BeanUtils的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
获取字节码文件对象
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)