java-反射单级VO操作

本文介绍了一种利用Java反射机制实现批量设置VO类属性的方法,通过解析传入的字符串参数,动态调用set方法,避免了多次单独调用带来的不便,提高了代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java-反射单级VO操作

主要用于一次可以设置多个属性值;

例如我们现在定义一个Person类,里面有姓名和年龄属性;如果我们调用set来设置属性,要设置两次,如果人数增多并且属性值不是两个就要多次调用set方法;

例子


class Emp{
    private String name;
    private String dept;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", dept='" + dept + '\'' +
                '}';
    }
}

现在有需求要一次性设置这两个值 传入 属性1:xxx|属性2:xxx

首先创建一个EmpAction类,这个类是真实交给用户操作的类

class EmpAction{
    private Emp emp=new Emp();
    public  void setValue(String name) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        BeanUtil.setValue(this,name);
    }

    public Emp getEmp() {
        return emp;
    }
}

还有一个工具类,是设置值的类

class BeanUtil{
    /*
    * 传入:
    * emp.name:HaHa|emp.dept: 上班
    * */
    public static void setValue(Object obj,String name) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        String[] value=name.split("\\|");
        for(int i=0;i<value.length;i++){
            //属性值HaHa
            String realValue=value[i].split(":")[1];
            //类名 emp
            String objectValue=value[i].split(":")[0].split("\\.")[0];
            //属性名 name
            String objectName=value[i].split(":")[0].split("\\.")[1];
            Object objectAction=getObject(obj,objectValue);
            setValueObject(objectAction,objectName,realValue);

        }
    }
    public static Object getObject(Object obj,String objectValue) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Class cls=obj.getClass();
        String str="get"+spellName(objectValue);
        Method method=cls.getMethod(str);
        return method.invoke(obj);
    }
    public static void setValueObject(Object obj,String objectName,String value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            Class cls=obj.getClass();
            String str = "set"+spellName(objectName);
            Method method=cls.getMethod(str,String.class);
            method.invoke(obj,value);

    }
    public static String spellName(String name){
        return name.substring(0,1).toUpperCase()+name.substring(1);
    }
}
public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        String str="name:托尼|job:造型师";
      EmpAction empAction=new EmpAction();
      empAction.setValue(str);
        System.out.println(empAction.getEmp());

    }
}

这样就可以一次性设置多个值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值