java高级-反射给类的属性赋值,主要用于繁琐的getter和setter方法

一、讨论传统属性赋值和反射机制赋值

    1.1传统赋值的弊端

        当一个类的属性非常多的时候,采用传统赋值方式的话,就会调用大量的setter方法,会存在大量的重复操作。

    1.2属性内容的自动设置思路

5e60315862ca5065e25f7c94ad8a6729b03.jpg

   1.3定义beanUtils工具类

        1405885d5f71c528ed5b11b7717781c77e1.jpg

   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);
        }

    }
}

     执行结果:

30336629003da458c6dc9e52011c07be475.jpg

以上都是针对字符串实现,下面是设置不同的数据类型。

/*反射实现自动给简单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);
        }

    }
}

执行结果:

bcf0d0e6c6c8f6c9e8f1db1bd1004d477b2.jpg

 

注:初学者,写的不好请见谅,如有相关问题记得私信我

转载于:https://my.oschina.net/chenzhou/blog/2876185

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值