一、讨论传统属性赋值和反射机制赋值
1.1传统赋值的弊端
当一个类的属性非常多的时候,采用传统赋值方式的话,就会调用大量的setter方法,会存在大量的重复操作。
1.2属性内容的自动设置思路
1.3定义beanUtils工具类
1.4反射实现java简单类赋值
/*反射实现自动给简单java类赋值 *传统赋值的弊端,如果属性太多,则会存在大量重复的操作 * * */ import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { String value = "ename:张三|job:java开发人员"; Emp emp = ClassInstanceFactory.create(Emp.class, value); System.out.println("姓名:" + emp.getEname() + "职位:" + emp.getJob()); } } class Emp{ private String ename; private String job; public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } } class ClassInstanceFactory{ public ClassInstanceFactory(){ } public static <T> T create(Class<T> clazz,String value) { //如果要想采用反射机制来实现简单java类的赋值操作,类中必须要有无参构造方法 Object obj = null; try { obj = clazz.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } //设置属性 BeanUtils.setValue(obj,value); return (T)obj; } } class BeanUtils{ public BeanUtils(){ } public static void setValue(Object obj,String value){ String[] str = value.split("\\|");//按照|拆分字符串 for(int i = 0; i< str.length; i++){ String[] s = str[i].split(":"); //s[0]保存的是属性名称,s[1]保存的是属性内容 try{ Field field = obj.getClass().getDeclaredField(s[0]); Method method = obj.getClass().getDeclaredMethod("set"+StringUtils.initCap(s[0]),field.getType()); method.invoke(obj,s[1]); }catch(Exception e){ e.printStackTrace(); } } } } /*实现首字母大写*/ 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); } } }
执行结果:
以上都是针对字符串实现,下面是设置不同的数据类型。
/*反射实现自动给简单java类赋值 *传统赋值的弊端,如果属性太多,则会存在大量重复的操作 * * */ import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { String value = "ename:张三|job:java开发人员|price:44.23"; Emp emp = ClassInstanceFactory.create(Emp.class, value); System.out.println("姓名:" + emp.getEname() + ",职位:" + emp.getJob()+",价格:"+emp.getPrice()); } } class Emp{ private String ename; private String job; private double price; public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } class ClassInstanceFactory{ public ClassInstanceFactory(){ } public static <T> T create(Class<T> clazz,String value) { //如果要想采用反射机制来实现简单java类的赋值操作,类中必须要有无参构造方法 Object obj = null; try { obj = clazz.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } //设置属性 BeanUtils.setValue(obj,value); return (T)obj; } } class BeanUtils{ public BeanUtils(){ } public static void setValue(Object obj,String value){ String[] str = value.split("\\|");//按照|拆分字符串 for(int i = 0; i< str.length; i++){ String[] s = str[i].split(":"); //s[0]保存的是属性名称,s[1]保存的是属性内容 try{ Field field = obj.getClass().getDeclaredField(s[0]); Method method = obj.getClass().getDeclaredMethod("set"+StringUtils.initCap(s[0]),field.getType()); method.invoke(obj,converAttributeValue(field.getType().getName(),s[1])); }catch(Exception e){ e.printStackTrace(); } } } public static Object converAttributeValue(String type,String value){ if("long".equals(type)||"java.lang.Long".equals(type)){ return Long.parseLong(value); }else if("double".equals(type)||"java.lang.double".equals(type)){ return Double.parseDouble(value); }else{ return value; } } } /*实现首字母大写*/ 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); } } }
执行结果:
注:初学者,写的不好请见谅,如有相关问题记得私信我