反射和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<T>… 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<String,Object> map = new HashMap<String,Object>(); 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) { } } } }
|