反射实现对简单java类的自动赋值(包括多级关系)

这篇博客探讨了如何利用Java反射API实现对包含多级关系的简单Java类对象的自动赋值,详细介绍了反射在Java高级语法中的应用。

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

package com.mldn.demo;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 简单java类的自动赋值,包括基本的数据类型和链式类
 * @author lenovo
 *
 */
public class Demo03 {
	public static void main(String[] args) {
		String value="ename:Simth|job:Clerk|age:11|dept.dname:财务部|dept.company.name:csDN";//输入的时候通过|来区分属性,用:来连接属性的值
		Emp emp=ClassInstanceFactory.creat(Emp.class, value);
		System.out.println("姓名:"+emp.getEname()+"工作:"+emp.getJob()+"年龄"+emp.getAge());
		System.out.println(emp.getDept().getDname());
		System.out.println(emp.getDept().getCompany().getName());
	}

}

/**
 * 工程类
 * @author lenovo
 *@param clazz 对象的类型
 *@param value 属性的值
 *@return 返回一个已经设置好属性内容的实例化对象
 */
class ClassInstanceFactory{
	private ClassInstanceFactory() {};
	public static <T> T creat(Class<?> clazz,String value) {
		try {
			//要想改变属性的内容必须实例化对象
			Object obj = clazz.getDeclaredConstructor().newInstance();
			//对对象的属性进行赋值(内容)
			BeanUtils.setValue(obj, value);
			return (T) obj;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} 
		
	}
}

/**
 * 把首字母变成大写
 * @author lenovo
 *
 */
class StringUtils{
	public static String initcap(String str) {
		if(str==null||"".equals(str)) {
			return str;
		}
		if(str.length()==1) {
			return str.toUpperCase();
		}else {
			return str.substring(0, 1).toUpperCase()+str.substring(1);
		}
	}
}
class BeanUtils{
	private BeanUtils() {};
	/**
	 * @param obj 需要更改属性的对象
	 * @param value 
	 */
	public static void setValue(Object obj,String value) {
		
		String results[]=value.split("\\|");
		for(int x=0;x<results.length;x++) {
			//attval[0]是属性的名称,而attval[1]是属性的内容
			String attval[]=results[x].split(":");
		    try {
		    	//包含点号说明了有多级的关系
		    	if(attval[0].contains(".")) {
		    		String temp[]=attval[0].split("\\.");
		    		//当前的对象
		    		Object currentObject=obj;
		    		//长度减一,因为最后一位是属性
		    		for(int y=0;y<temp.length-1;y++) {
		    			Method method =currentObject.getClass().getDeclaredMethod("get"+StringUtils.initcap(temp[y]));
		    			Object tempObject = method.invoke(currentObject);
		    			if(tempObject==null) {
		    				Field field = currentObject.getClass().getDeclaredField(temp[y]);
		    				Method setMethod = currentObject.getClass().getDeclaredMethod("set"+StringUtils.initcap(temp[y]), field.getType());
		    				Object newObject = field.getType().getDeclaredConstructor().newInstance();
		    				setMethod.invoke(currentObject, newObject);
		    				currentObject=newObject;
		    			}else {
		    				currentObject=tempObject;
		    			}
		    		}
		    		//进行属性内容的设置
		    		Field field = currentObject.getClass().getDeclaredField(temp[temp.length-1]);
		    		Method method = currentObject.getClass().getDeclaredMethod("set"+StringUtils.initcap(temp[temp.length-1]), field.getType());
		    		Object convertValue = BeanUtils.convertAttributeValue(field.getType().getName(),attval[1]);
		    		method.invoke(currentObject, convertValue);
		    		
		    	}else {
				Field field = obj.getClass().getDeclaredField(attval[0]);
				Method setMethod = obj.getClass().getDeclaredMethod("set"+StringUtils.initcap(attval[0]), field.getType());
				Object convertAttributeValue = BeanUtils.convertAttributeValue(field.getType().getName(), attval[1]);
				setMethod.invoke(obj, convertAttributeValue);
		    	}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    
			
		}
		
	}
    private static Object convertAttributeValue(String type,String value) {
		if("long".equals(type)||"java.lang.Long".equals(type)){
			return Long.parseLong(value);
		}else if("int".equals(type)||"java.lang.int".equals(type)) {
			return Integer.parseInt(value);
		}else if("double".equals(type)||"java.lang.double".equals(type)) {
			return Double.parseDouble(value);
		}else if("java.util.Date".equals(value)) {
			SimpleDateFormat sdf=null;
			if(value.matches("\\d{4}-\\d{2}-\\d{2}")) {
				sdf=new SimpleDateFormat("yyyy-MM-dd");
			}else if(value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
				sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			}else {
				return new Date();
			}
			try {
				return sdf.parse(value);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				return new Date();
			}
		}
    	return value;
		
	}
	
}

class Company{
	private String name;
    public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getCreatedate() {
		return createdate;
	}
	public void setCreatedate(Date createdate) {
		this.createdate = createdate;
	}
	private Date createdate;
}
class Dept{
	private String dname;
	private String loc;
	private Company company;
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	public Company getCompany() {
		return company;
	}
	public void setCompany(Company company) {
		this.company = company;
	}
}
class Emp{
	private String ename;
	private String job;
	private int age;
	private Dept dept;
	public void setDept(Dept dept) {
		this.dept = dept;
	}
	public Dept getDept() {
		return dept;
	}
	public void setAge(int age) {
		this.age=age;

	}
    public int getAge() {
		return age;
	}
	
	public  void setEname(String ename) {
		this.ename=ename;
	}
	public void setJob(String job) {
		this.job=job;
	}
	public String getJob() {
		return job;
	}
	public String getEname() {
		return ename;
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值