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

109 篇文章 0 订阅



反射与简单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,大大简化了代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的反射机制可以实现给实体类添加属性,但是这个操作并不是很常见,也不建议这么做。因为Java反射机制是基于类的,而类是静态的,如果在运行时给类添加属性,可能会导致一些不可预测的问题。如果您需要动态地添加属性,可以考虑使用Map集合或者其他动态容器来存储属性值。如果您坚持要使用反射机制给实体类添加属性,可以通过以下步骤实现: 1. 获取实体类的Class对象 2. 获取Field数组,即实体类的所有属性 3. 创建新的Field对象,包括属性的名称、类型、修饰符等 4. 将新的Field对象添加到Field数组中 5. 使用反射机制设置该属性的值 下面是一个简单的示例代码: ``` public class ReflectTest { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { // 获取实体类的Class对象 Class clazz = User.class; // 获取Field数组 Field[] fields = clazz.getDeclaredFields(); // 创建新的Field对象 Field newField = new Field("newField", String.class, Modifier.PRIVATE); // 将新的Field对象添加到Field数组中 Field[] newFields = Arrays.copyOf(fields, fields.length + 1); newFields[fields.length] = newField; // 使用反射机制设置该属性的值 User user = new User(); newField.setAccessible(true); newField.set(user, "newFieldValue"); // 验证属性值是否设置成功 System.out.println(user.getNewField()); } } class User { private String name; private int age; // 新添加的属性 private String newField; // getter和setter方法 // ... } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值