本文共 3669 字,大约阅读时间需要 12 分钟。
反射和BeanUtils工具类的使用
一、反射
1、获取字节码对象
A、对象
Student s = new Student();
Class clazz = s.getClass();
B、类名
Class clazz = Student.class;
C、全类名
Class clazz = Class.forName(“全路径类名.Student”)(推荐使用)
2、获取构造方法
作用:对成员进行初始化
A、获取全部public构造方法;获取的是一个构造方法集合
Constructor[] cs = clazz.getConstructors();
B、获取无参构造方法
Constructor c = clazz.getConstructor();//获取无参构造
C、获取带参的有参构造方法
Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造,参数1类型为String,参数2类型为int
直接通过Class类中的newInstance()和获取getConstructor()有什么区别?
newInstance()方法,只能通过空参的构造方法创建对象
getConstructor(Class…parameterTypes)方法,方法接受一个可变参数,可以根据传入的类型来匹配对应的构造方法
3、反射操作成员变量。
1). 通过反射获取该类的字节码对象
Class clazz = Class.forName("com.heima.Person");
2.) 创建该类对象
Object p = clazz.newInstance();
3.) 获取该类中需要操作的字段(成员变量)
getField(String name) --> 方法传入字段的名称.
注意: 此方法只能获取公共的字段
Field f = clazz.getField("age");
4.) 通过字段对象中的方法修改属性值
void set(Object obj, Object value) --> 参数1):要修改那个对象中的字段,参数2):将字段修改为什么值.
如果变量是私有变量
需要进行强制访问
反射private属性执行流程
1.) 获取学生类字节码对象
2. )获取学生对象
3. )通过getDeclaredField方法获取私有字段
4. )通过setAccessible让jvm不检查权限
5. )通过set方法设置对象为具体的值
public class ReflectDemo4 {
public static void main(String[] args) throws ReflectiveOperationException {
//获取学生类的字节码对象
Class clazz = Class.forName("com.itheima_01.Student");
//获取学生对象
Object stu = clazz.newInstance();
//获取私有的字段对象
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);//设置反射时取消Java的访问检查,暴力访问
//System.out.println(f);
f.set(stu, "lisi");
Object name = f.get(stu);
System.out.println(name);
}
4、获取成员方法
// 获取字节码对象
Class clazz = Class.forName("com.heima.Student");
// 创建学生对象
Object stu = clazz.newInstance();
// 暴力反射获取方法
Method method = clazz.getDeclaredMethod("method");
// 让jvm不检查权限
method.setAccessible(true);
// 执行方法
method.invoke(stu);
二、JavaBean的概述、BeanUtils的使用
1、avaBean类:用于封装数据
A、类使用用public修饰、
B、提供私有修饰的成员变量
C、提供变量公共的get/set方法
D、提供无参构造
E、实现序列接口
类的定义例如
public class Student implements Serializable{
}
2、BeanUtils 工具类
使用前需要进行架包使用
主要的使用方法
1).导入两个jar包
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
2. )将jar包Build path配置到当前的classpath环境变量中
static void setProperty(Object bean, String name, Object value)
setProperty 用来给对象中的属性赋值(了解)
参数1: 需要设置属性的对象
参数2: 需要修改的属性名称
参数3: 需要修改的具体元素
static String getProperty(Object bean, String name)
getProperty 用来获取对象中的属性(了解)
参数1: 要获取的javaBean对象
参数2: 对象中的哪个属性
static void populate(Object bean, Map properties)
参数1: 要设置属性的对象
参数2: 将属性以Map集合的形式传入
Key : 属性的名称
Value: 属性具体的值
public class BeanUtilsDemo {
public static void main(String[] args) throws ReflectiveOperationException {
//static void populate(Object bean, Map properties)
Person p = new Person();
Map map = new HashMap();
map.put("name", "lisi");
map.put("age", 18);
map.put("gender", "male");
BeanUtils.populate(p,map);
System.out.println(p);
}
3、自己编写MyBeanUtils工具
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MyBeanUtils {
public static void setProperty(Object bean , String name , Object value) throws Exception{
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField(name);
//设置权限,让虚拟机不进行访问检查
f.setAccessible(true);
//赋值
f.set(bean,value);
}
public static String getProperty(Object bean,String name) throws Exception{
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField(name);
f.setAccessible(true);
Object obj = f.get(bean);
return obj.toString();
}
public static void populate(Object bean , Map map) throws ReflectiveOperationException{
Class clazz = bean.getClass();
Set keys = map.keySet();
for (Object key : keys) {
try {
Field f = clazz.getDeclaredField(key.toString());
Object value = map.get(key);
f.setAccessible(true);
f.set(bean, value);
} catch (NoSuchFieldException e) {
}
}
}
}
转载地址:http://wxspa.baihongyu.com/