【java】通过反射实现简单的单级VO

本文介绍如何利用Java反射API实现一个简单的值对象(VO)设置,通过接收固定格式的字符串来动态设置对象属性。以雇员类为例,输入'emp.name:Simith|emp.job:Clerk',输出Emp [name=Simith, job=Clerk]。该方法灵活,适用于不同类的属性设置,如将雇员类替换为学生类,仅需修改配置即可。" 127796724,16123118,Python毕业设计:商品推荐系统实现,"['python', 'django', '开发语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:传入一个固定格式字符串:“属性名称:值|属性名称:值”,能正确设置对应的值,最后按固定格式输出。实际操作的类文件不需要更改变动,只需改动配置文件,则可以适应其他相似需求。

另外,为了简化,此时的值都为String类型。

关键字:简单Java类;反射

实现后的包&类如下:其中util包为核心操作,不需改动;vo和action是对应的实际业务类和连接类,根据需要更改配置;demo为最终请求发起测试类。

以雇员类为例,需要展示的属性为:name和job,传入字符串为:"emp.name:Simith|emp.job:Clerk"

一:设置Emp类,包括属性和setter,getter,toString方法

package com.java.vo;

public class Emp {
	private String name;
	private String job;
	public Emp() {}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public String toString() {
		return "Emp [name=" + name + ", job=" + job + "]";
	}
}

二:BeanOperation类

package com.java.util;

//本类主要负责实现自动的VO匹配处理操作。
//本身不需要实例化对象完成,所以构造私有。
public class BeanOperation {
	private BeanOperation() {}
	public static void setBeanValue(Object actionBean,String value) throws Exception {
		//拆分为ename和job
		String[] arr = value.split("\\|");
		for (int i = 0; i < arr.length; i++) {	//拆分为了:对象.属性名称:值
			String[] temp = arr[i].split(":");
			String attribute = temp[0];	//对象.属性名称
			String content = temp[1];	//值
			String[] field = attribute.split("\\.");
			//取得当前的Emp对象
			Object currentObject = ObjectUtils.getObjectValue(actionBean, field[0]);
			//设置对应Emp对象的对应的属性值
			ObjectUtils.setObjectValue(currentObject,field[1],content);
			
		}
	}
}

三:ObjectUtils类,取得当前对象:

package com.java.util;

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

public class ObjectUtils {
	private ObjectUtils() {}
	
	public static Object getObjectValue(Object actionBean, String str) throws Exception {
		String MethodName = "get"+StringUtils.initcap(str);
		//确定EmpAction中是否存在对应的Emp对象属性
		Field field = actionBean.getClass().getDeclaredField(str);
		if(field == null) {
			return null;
		}
		//通过反射调用EmpAction的getEmp方法,取得当前的Emp对象
		Method method = actionBean.getClass().getMethod(MethodName);
		return method.invoke(actionBean);
	}
	
	public static void setObjectValue(Object currentObject,String fieldName,String content) throws Exception{
		String reName = StringUtils.initcap(fieldName);
		Field field = currentObject.getClass().getDeclaredField(fieldName);
		if(field == null) {
			return;
		}
		Method setMethod = currentObject.getClass().getMethod("set"+reName,field.getType());
		setMethod.invoke(currentObject,content);
	}

}

四:StringUtils类,负责字符串的统一处理

package com.java.util;

public class StringUtils {
	private StringUtils() {}
	public static String initcap(String str) {
		return str.substring(0, 1).toUpperCase()+str.substring(1);
	}
}
五:EmpAction类
package com.java.action;

import com.java.util.BeanOperation;
import com.java.vo.Emp;

public class EmpAction {
	private Emp emp = new Emp();
	public void setValue(String value) {
		//之所以要传递this,主要是将EmpAction类的对象传递到方法去
		//因为给定的字段是:“emp.ename:value”,而emp对应的是getEmp()方法
		try {
			BeanOperation.setBeanValue(this, value);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public Emp getEmp() {
		return emp;
	}
}

六:TestDemo类

package com.java.demo;

import com.java.action.EmpAction;

public class TestDemo {
	public static void main(String[] args){
		String value = "emp.name:Simith|emp.job:Clerk";
		EmpAction empAction = new EmpAction();
		empAction.setValue(value);
		System.out.println(empAction.getEmp());
	}
}

输出结果:Emp [name=Simith, job=Clerk]



如果现在有一个学生类,需要输出Student的姓名,年纪,只需配置StudentAction和Emp类,其他不用更改:

Student类:

package com.java.vo;

public class Student {
	private String name;
	private String grade;
	public Student() {}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", grade=" + grade + "]";
	}
	
}

StudentAction:

package com.java.action;

import com.java.util.BeanOperation;
import com.java.vo.Student;

public class StudentAction {
	private Student student = new Student();
	public void setValue(String value) {
		//之所以要传递this,主要是将EmpAction类的对象传递到方法去
		//因为给定的字段是:“emp.ename:value”,而emp对应的是getEmp()方法
		try {
			BeanOperation.setBeanValue(this, value);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public Student getStudent() {
		return student;
	}
	
}

执行:

package com.java.demo;

import com.java.action.StudentAction;

public class TestStudentDemo {
	public static void main(String[] args) {
		String value = "student.name:滚滚|student.grade:一年级";
		StudentAction empAction = new StudentAction();
		empAction.setValue(value);
		System.out.println(empAction.getStudent());
	}
}

输出:Student [name=滚滚, grade=一年级]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值