反射与单级VO操作

现在有一个简单的Java类,按照原始的做法进行Setter和getter属性操作

原始做法:

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 Test1Emp {
    public static void main(String[] args) {
        Emp emp= new Emp();
        emp.getEname();
        emp.getJob();
        emp.setEname("Hello");
        emp.setJob("java coder");
        System.out.println(emp);
    }
}

假设一个类有十几个属性,按照原始的做法,就会显得很麻烦,那么我们有没有办法让属性很多的类操作起来更方便呢?答案是:当然有.

现在希望能对程序做简化,输入字符串"属性名称:属性值|属性名称:属性值|属性名称:属性值......",就可以将属性设置好,设计思路如下:

以上的思路其实就是单级VO操作

1.单级VO操作

VO: value object,值对象,使用一个值作为数据的存储与传递

VO一般是用于值的存储与传递,目前这里用的值是字符串

2.Emp类

这里以Emp为例

package www.bit.java.vo;
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 + '\'' +
        '}';
 }
}

3.EmpAction类设计

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

package www.bit.java.vo;
import www.bit.java.util.BeanOperation;
public class EmpAction {
  private Emp emp = new Emp() ;
  public void setValue(String value) throws Exception{
    BeanOperation.setBeanValue(this,value) ;
 }
  public Emp getEmp(){
    return emp ;
 }
}

4.BeanOperation类设计

单级VO的核心操作

package reflect;

/**
 * Author:weiwei
 * description:
 * Creat:${Date}
 **/

import javax.swing.tree.ExpandVetoException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 本类主要负责实现自动的VO匹配处理操作
 */
public class BeanOperation {
    private BeanOperation() {
    }

    /**
     * 负责类中的属性操作
     *
     * @param actionObject 表示当前发出设置请求的程序类的当前对象
     * @param msg          属性的具体内容,格式为:"属性名称:|内容|属性名称:|内容...."
     */
    public static void setBeanValue(Object actionObject, String msg) throws Exception {
        //要想进行内容的设置,必须将字符串拆分
        //按照竖线拆分,取出所有要设置的内容
        String[] result = msg.split("\\|");
        //每次执行后只剩下"属性名称:内容"
        for (int i = 0; i < result.length; i++) {
            //需要对属性名称及内容做进一步拆分
            String[] temp = result[i].split(":");
            //属性名称"emp.ename"
            String attribute = temp[0];
            //属性内容
            String value = temp[1];
            String[] fields = attribute.split("\\.");
            //获取当前操作的简单的Java类对象
            Object currentObject = getObject(actionObject, fields[0]);
            //调用简单Java类的Setter方法
            setObjectValue(currentObject, fields[1], temp[1]);
        }
    }

    /**
     * 将给定字符串的首字母大写
     *
     * @param str 给定的字符串
     * @return 返回首字母大写的字符串
     */

    public static String initCap(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    /**
     * 负责调用XXXAction类中的gettter方法取得简单的Java类对象
     *
     * @param obj       表示调用方法的所在类对象
     * @param attribute 表示属性名称
     * @return 调用对象结果
     */

    public static Object getObject(Object obj, String attribute) throws Exception {
        String methodName = "get" + initCap(attribute);
        //调用指定属性的Filed对象,目前是取得对象类型如果没有此属性意味着操作无法进行
        Field field = obj.getClass().getDeclaredField(attribute);
        if (field == null) {
            //第二次尝试从父类中取得该属性
            field = obj.getClass().getField(attribute);
        }
        if (field == null) {
            //两次都未取得指定属性的对象,表示该对象一定不存在
            return null;
        }
        Method method = obj.getClass().getMethod(methodName);
        return method.invoke(obj);
    }

    /**
     * 根据指定的类对象设置指定类中的属性,调用setter方法
     *
     * @param obj       属性所在类的实例化对象
     * @param attribute 属性名称
     * @param value     属性内容
     */

    public static void setObjectValue(Object obj, String attribute, String value)
            throws Exception {
        Field field = obj.getClass().getDeclaredField(attribute);
        //判断属性是否存在
        if (field == null) {
            //第二次尝试从父类中取得该属性
            field = obj.getClass().getField(attribute);
        }
        if (field == null) {
            //两次都未取得指定属性的对象,表示该对象一定不存在
            return;
        }
        String methodName = "set" + initCap(attribute);
        Method setMethod = obj.getClass().getMethod(methodName, field.getType());
        setMethod.invoke(obj, value);
    }

}

  5.Test测试类 

package www.bit.java.vo;
public class TestDemo {
  public static void main(String[] args) throws Exception {
   String value = "emp.ename:yuisama|emp.job:Java Coder" ;
   EmpAction empAction = new EmpAction() ;
   empAction.setValue(value) ;
   System.out.println(empAction.getEmp());
 }
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值