反射与简单java类:一点都不简单



反射与简单Java类

需要先了解:
>反射与工厂模式之间不可告人的秘密<
>反射-我要窥探类中的世界<
在所有开发框架中都有反射的身影,没有反射就没有开发框架。
反射与单级VO操作
单级VO
如果现在有一个简单java类,按照原始的做法是用getter、setter对属性进行操作,看起来并没什么问题,但是当有几十个属性,无疑是个麻烦的操作。所以通过反射操作VO,实现将输入的格式如:”属性名称:属性值|属性名称:属性值|属性名称:属性值|….”的字符串操作
基本程序:Emp类设计(简单Java类)

package reflect;

/**
 * 简单java类
 * @author Logicr
 *
 */
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 + "]";
    }

}

EmoAction类

package reflect;

/**
 * @author Logicr
 *
 */
public class EmpAction {
    private Emp emp = new Emp();
    public void setValue(String value) throws Exception {
        //this是本类
        BeanOperation.setBeanvalue(this, value);
    }
    public Emp getEmp() {
        return emp;
    }
}

BeanOperation类(公共程序类)

package reflect;

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

/**
 * @author Logicr
 *负责自动实现自动的VO匹配处理操作
 */
public class BeanOperation {
    private BeanOperation() {}


    /**
     * @param actionObject 表示当前发出设置请求的程序的当前对象?
     * @param msg "emp.ename:Jan|emp.job:Student"
     * @throws Exception
     */
    public static void setBeanvalue(Object actionObject ,String msg) throws  Exception {


        //进行拆分
        String [] result = msg.split("\\|");
        for (int i = 0; i < result.length; i++) {
            String [] tmp = result[i].split(":");
            String attribute = tmp[0];//属性名称
//          String value = tmp [1];//内容
            String [] fields = attribute.split("\\.");//


            //获取类对象,fields[0]:emp
            Object currentObject = getObject(actionObject,fields[0]);
            //调用setter方法 fields[1] = ename , tmp[1] = Jan;
            setObject(currentObject, fields[1], tmp[1]);
        }
    }

    /**
     * 首字母大写操作,构造setter、getter方法的名字
     * @param str
     * @return
     */
    public static String initCap(String str) {
        return str.substring(0, 1).toUpperCase()+str.substring(1);
    }
    /**
     * @param obj 调用方法所在的类对象
     * @param attribute 属性名称
     * @return
     * @throws Exception
     */
    public static Object getObject(Object  obj,String attribute) throws Exception{
        String methodName = "get"+initCap(attribute);
        //取得类对象
        Field field = obj.getClass().getDeclaredField(attribute);
        if (field == null) {
            field = obj.getClass().getField(attribute);
        }
        if (field == null) {
            return null;
        }
        //取得getter方法
        Method method = obj.getClass().getMethod(methodName);
        //调用返回
        return method.invoke(obj);
    }
    /**
     * 设置对象属性
     * @param obj 对象
     * @param attribute 属性名称
     * @param valve 内容
     * @throws Exception
     */
    public static void setObject(Object obj,String attribute,String valve) 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);
        //setter方法,
        Method setMethod = obj.getClass().getMethod(methodName, field.getType());
        //设置属性
        setMethod.invoke(obj, valve);
    }
}

测试类

package reflect;

public class TestDemo {

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

}

//+++++++++++++++++++++++++++
Emp [ename=Jan, job=Student]

对于TestDemo来说,只需要调用EmpAction类即可,不需要担心有没有setter、getter,而EmpAction只需要将参数传入BeanOperation,它就像一套模板,不会一直去写getter、setter方法,而是通过这个模板进找到getter、setter,大大简化了代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值