Java 反射与单级VO操作

反射与单级VO操作
先看一个基本程序

package www.bit.java.vo;
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;
    }
    @Override
    public String toString() {
        return "Emp{" + "ename='" + ename + '\'' + ", job='" + job + '\'' + '}';
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Emp emp = new Emp() ;
        emp.setEname("zhangsan") ;
        emp.setJob("Java Coder") ;
        System.out.println(emp);
    }
}

假设一个类中存在有几十个属性,要按照原始做法,要调用几十次setter方法,这样操作就太麻烦了。现在希望能对程序做简化,输入字符串

“属性名称:属性值|属性名称:属性值|属性名称:属性值|….”,

就可以将类中的属性设置好。希望通过此程序实现任意的简单Java类的属性设置。

设计思路如下:
这里写图片描述

现在所有的操作是通过TestDemo类调用EmpAction类实现的,而EmpAction类的主要作用是在于定位要操作的属性类型。同时该程序应该符合于所有简单的Java类开发形式,因此对于我们的设计而言必须有一个单独的类(BeanOperation)实现此适配。

例:Emp类设计(简单Java类)

package test;

public 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;
    }
    @Override
    public String toString() {
        return "Emp{" + "ename= " + ename  + ", job= " + job + "}";
    }
}

例:EmpAction类设计

package test;

import bit.util.BeanOperation;

public class EmpAction  {
    private Emp emp = new Emp();

    public void setValue(String value) throws Exception {

        //this表示EmpAction的对象
        BeanOperation.setBeanValue(this, value);
    }
    public Emp getEmp() {
        return emp;
    }
}

例:BeanOperation类设计(公共程序类)

package bit.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//此类通过反射来进行简单的java类的值插入
public class BeanOperation {
    private BeanOperation() {}

    //此方法用于给对象插入属性
    //emp.ename:zhangsan|emp.job:Coder
    public static void setBeanValue(Object obj, String data) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        //当前obj表示EmpAction对象
        //第一次拆分
        String[] result = data.split("\\|");
        for (int i = 0; i < result.length; i++) {
            //emp.ename:zhangsan
            String[] temp = result[i].split(":");
            //取得要插入的数据
            String value = temp[1];
            //取得具体className emp
            String className = temp[0].split("\\.")[0];
            //取得具体属性名
            String fieldName = temp[0].split("\\.")[1];
            Object realObject = getRealObject(obj, className);
            //拿到具体操作的Emp类之后,开始调用具体的set方法来设置属性
            Class<?> realClass = realObject.getClass();
            Method setMethod = realClass.getDeclaredMethod("set" + initCap(fieldName), String.class);
            setMethod.invoke(realObject, value);
        }       
    }
    //
    private static Object getRealObject(Object obj, String className) throws NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        //拿到EmpAcrion类的Class对象
        Class<?> cls = obj.getClass();
        Field field = cls.getDeclaredField(className);
        //在当前类中没有找到此属性
        if(field == null) {
            //再从父类中找此属性
            field = cls.getField(className);
            if(field == null) {
                return null;
            }   
        }
        //获取get属性名
        String methodName = "get" + initCap(className);
        Method getObjectMethod = cls.getDeclaredMethod(methodName);
        //相当于调用empAction.getEmp();
        return getObjectMethod.invoke(obj);
    }

    private static String initCap(String value) {
        //将首字母大写然后返回
        return value.substring(0, 1).toUpperCase()+value.substring(1);
    }
}

例:测试类设计

package test;

public class Test {

    public static void main(String[] args) throws Exception {
        String value = "emp.ename:zhangsan|emp.job:Conder";
        EmpAction empAction = new EmpAction();
        empAction.setValue(value);
        System.out.println(empAction.getEmp());
    }
}

这是上述测试类的运行结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值