欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反射学习笔记

程序员文章站 2024-03-23 14:37:46
...

反射学习笔记


内容

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

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

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)