反射学习笔记

反射学习笔记


内容

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

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

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 准备工作
  1. 导入两个jar包
    commons-beanutils.jar
    commons-logging.jar
  2. 将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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值