A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zjj5669436182 中级黑马   /  2017-12-24 21:43  /  2190 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射和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. )通过setAccessiblejvm不检查权限
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的使用
1avaBean类:用于封装数据
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. )jarBuild 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) {
                       
                        }
                }
               
        }
}

5 个回复

倒序浏览
继续加油~~棒棒哒
回复 使用道具 举报
哇塞,简直帅呆了666,保持
回复 使用道具 举报
回复 使用道具 举报
温故而知新   加油哦   继续努力
回复 使用道具 举报

总结很不错哟~继续加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马