反射之简单java类

版权声明:白小姐 https://blog.csdn.net/bailerong123/article/details/88935715


没有我们的反射就没有我们的开发框架

反射与简单java类

反射与VO操作

如果现在又一个简单java类,按照原始的做法使用getter与setter对属性进行操作
基本程序:

/*
* 这是我们的一个关于基础操纵的代码,getter和setter方法
* */
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 baseTest {
    public static void main(String[] args) {
        Emp emp=new Emp();
        emp.setEname("lele");
        emp.setJob("student");
        System.out.println(emp);
    }
}

假设一个类之中又几十个属性,要按照原始做法来看,要调用几十次setter方法,这样的操作太过于麻烦。
我们希望能够对程序做简化,输入字符串"属性名称:属性值 | 属性名称:属性值| …",就可以将类中的属性设置好。希望通过此程序实现任意的简单java类的属性设置
现在所有的操作是通过TestDemo类调用EmpAction类实现的,而EmpAction类的主要作用时在于定位要操作的属性类型。同时该程序应该符合所有简单java类开发形式,因此对于我们的设计而言必须有一个单独的类(BeanOperation)(实现此适配)

package vo;

public class Emp {
    private String name;
    private String subject;

    public String getName() {
        return name;
    }

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

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

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

package vo;

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

/*
* 本类主要负责实现自动的VO匹配处理
*
*/
public class BeanOperation {
    private BeanOperation(){}
    /*
    * 负责设置类中的属性操作
    * actionObject表示当前发出设置请求的程序类的当前对象
    * 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]);
        }
    }
    /*
    将给定的字符串的首字母大写
    str 给定的字符串
    return 返回首字母大写的字符串
    * */
    public static String initCap(String str){
        return str.substring(0,1).toUpperCase()+str.substring(1);
    }
    /*
    *负责调用XXXAction类中的getter方法取得简单的java类对象
    * obj 表示调用方法所在类对象
    * attribute表示属性名称
    * return 调用对象结果
    */
    public static Object getObject(Object obj,String attribute) throws Exception {
        String methodName="get"+initCap(attribute);
        //调用指定属性的Field对象,目的是取得对象类型,
        // 如果没有此属性意味着操作无法继续进行
        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方法
    obj 属性所在类的实例化对象
    attribute 属性名称
    value  属性内容
    */
    public static void setObjectValue(Object obj, String attribute,String value) throws Exception {
        Field field=obj.getClass().getDeclaredField(attribute);
        if(field==null){
            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);
    }
}
package vo;

public class EmpAction {
    private Emp emp=new Emp();
    public void setValue(String value) throws Exception {
        BeanOperation.setBeanValue(this,value);
    }
    public Emp getEmp(){
        return emp;
    }
}

package vo;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String value="emp.name:lele|emp.subject:java Coder";
        EmpAction empAction=new EmpAction();
        empAction.setValue(value);
        System.out.println(empAction.getEmp());
    }
}

运行结果:

Emp{name='lele', subject='java Coder'}

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/bailerong123/article/details/88935715