单级属性赋值
对于此时的Emp类里面会发现所给出的数据都没有其他引用关联,只是描述了Emp本类对象,这样的设置称为单级设置处理,所以此时应该处理两件事情:
- 需要通过反射进行指定类对象的实例化处理;
- 进行内容的设置
- 定义StringUtils实现首字母大写功能
class StringUtils{ //实现首字母大写 public static String initcap(String str){ if (str == null || "".equals(str)){ return str; } if(str.length() == 1){ return str.toUpperCase(); }else{ return str.substring(0,1).toUpperCase() + str.substring(1); } } }
- 定义BeanUtils工具类,该工具类主要实现属性的设置
class BeanUtils{ //进行Bean处理的类 private BeanUtils(){} /** * 实现指定对象的属性设置 * @param obj 要进行反射操作的实例化对象 * @param value 包含有指定内容的字符窜,格式为"属性:内容|属性:内容" */ public static void setValue(Object obj,String value){ String[] result = value.split("\\|"); //按照“|”进行每一组属性的拆分 for(int x = 0;x < result.length;x++){ //循环设置属性内容 //attval[0]保存的是属性名称,attval[1]保存的是内容 String[] attval = result[x].split(":"); //获取“属性名称”与“内容”\ try{ Field filed = obj.getClass().getDeclaredField(attval[0]); //获取成员 //根据取名规范set+首字母大写属性获取方法 Method setMothod = obj.getClass().getMethod("set"+StringUtils.initcap(attval[0]),filed.getType()); setMothod.invoke(obj,attval[1]); //调用setter方法进行赋值 }catch (Exception e){ e.printStackTrace(); } } } }
-
ClassInstanceFactory负责实例化对象并且调用BeanUtils类实现属性内容的设置
class ClassInstanceFactory{ private ClassInstanceFactory(){} /** * 实例化对象的创建方法,该对象可以根据传入的字符串结构“属性:内容|属性:内容”传入 * @param clazz 要进行反射实例化Class类对象,有Class就可以反射实例化对象 * @param value 要给对象的属性内容 * @return 一个配置好属性内容的java类对象 */ public static <T>T create(Class<?> clazz,String value) { //如果要采用反射进行简单Java类对象属性设置的时候,类中必须要有无参构造 try { Object obj = clazz.getDeclaredConstructor().newInstance(); BeanUtils.setValue(obj,value); //调用BeanUtil实现属性的更改 return (T)obj; //返回对象 } catch (Exception e) { e.printStackTrace(); //如果此时出现了错误,抛出异常也没有作用 return null; } } }
-
测试类
public class Demo{ public static void main(String[] args) throws Exception{ String value = "eName:Smith|job:Clerk"; Emp emp = ClassInstanceFactory.create(Emp.class,value); System.out.println("姓名:"+emp.getEName()+"、职位:"+ emp.getJob()); } }
姓名:Smith、职位:Clerk
即使现在类中的属性再多也可以轻松实现setter的调用。