反射与简单类(单级VO)

46 篇文章 0 订阅
4 篇文章 0 订阅

代码部分:
1.Emp类:

package 反射与单级类;
/**
 * 封装实体
 * @author Administrator
 *
 */
public class Emp {
	private String uname;
	private String job;
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	@Override
	public String toString() {
		return "Emp [uname=" + uname + ", job=" + job + "]";
	}
	
}

2.ActionEmp类:

package 反射与单级类;

public class EmpAction {
	//String value ="syf:tudent|mq:student";
	public Emp emp = new Emp();
	void setValue(String value)throws Exception{
		BeanOperation.setBeabValue(this, value);
	}
	public Emp getEmp(){
		return this.emp;
	}
}

3.BeanOperation类:

package 反射与单级类;

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

//公共程序类
/**
 * 这里主要通过反射(使用反射必须要有构造函数,否则不能实例化对象)
 * 负责实现自动的vo(值对象)匹配
 * @author Administrator
 *
 */
public class BeanOperation {
	//无参构造方法,如果现在类中没有无参构造则在后期的实例化对象时无法使用Class类调用
	private BeanOperation(){};
	//负责类中的属性操作(按照name:syf:jpb.student对属性进行赋值操作
	/**
	 * 
	 * @param actionObject 是对象
	 * @param msg 是信息,也就是:syf:tudent|mq:student == 类名.属性名:属性值
	 * @throws Exception
	 */
	public static void setBeabValue(Object actionObject,String msg)throws Exception{
		//对字符串进行拆分,实现内容的设置
		//1.按照|进行拆分,可将已知字符串拆分成  类名.属性名:属性值的形式
		String []result = msg.split("\\|");
		for(int i = 0 ; i < result.length ; i ++){
			//2.按照 :进行拆分,可将已知字符串拆分成 : 类名.属性名  和  属性值   的形式
			String[] temp = result[i].split(":");
			//属性名
			String attribute = temp[0];
			//属性 内容
			String value = temp[1];
			//对 类名.属性名按照 . 在进行拆分,拆分结果为: 类名 和 属性名
			String[] fields = attribute.split("\\.");
			//调用当前操作的简单java类对象
			Object currentObject = getObject(actionObject,fields[0]);
			//调用简单java类的setter方法
			setObject(currentObject,fields[1],temp[1]);
		}
	}
	/**
	 * 这就是简单java类的setter方法
	 * @param currentObject 当前类对象
	 * @param value 属性名
	 * @param temp 属性 内容
	 * @throws Exception
	 */
	private static void setObject(Object currentObject, String value,
			String temp) throws Exception {
				//1.调用指定属性的Field对象,在本类中取得对象类型,若不存在此属性则操作无法继续执行
				Field field = currentObject.getClass().getDeclaredField(value);
				System.out.println("fiels:"+field);
				//2.在父类中获取该属性
				if(field == null) {
					field = currentObject.getClass().getField(value);
				}
				//在本类和父类中均不存在该属性,则该对象不存在
				if(field == null) {
					return;
				}
				//方法名的拼接 set+value = setUname
				String methodName = "set"+initCap(value);
				Method setMethod = currentObject.getClass().getMethod(methodName, field.getType());
				System.out.println("method:"+setMethod);
				Object invoke = setMethod.invoke(currentObject, temp);
				//System.out.println("invoke:"+invoke);
			}
			    //实现首字母大写操作
				
	
	
	private static Object getObject(Object actionObject, String attribute)throws Exception {
		//获取方法名 getUname
		String meathodName = "get"+initCap(attribute);
		1.调用指定属性的Field对象,在本类中取得对象类型,若不存在此属性则操作无法继续执行
		Field field= actionObject.getClass().getDeclaredField(attribute);
		//2.在父类中获取该属性
		if(field == null ){
			field = actionObject.getClass().getField(attribute);
			
		}
		//在本类和父类中均不存在该属性,则该对象不存在
		if(field == null){
			return null ;
		}
		Method method = actionObject.getClass().getMethod(meathodName);
		System.out.println("invoke:"+method.invoke(actionObject));
		return method.invoke(actionObject);
	}
	public static String initCap(String value) {
		return value.substring(0, 1).toUpperCase()+value.substring(1);
	}

    }

4.TestDome类:

package 反射与单级类;

public class TestDemo {
	public static void main(String[] args) throws Exception {
		//类.属性:属性内容
		String value="emp.uname:syf|emp.job:student";
		
		EmpAction empAction = new EmpAction();
		empAction.setValue(value);
		System.out.print(empAction.getEmp());
	}
}

JavaEE使用到的所有开发框架里面到处都是反射的身影,没有反射就没有开发框架。上面的代码主要结合简单Java类来进行反射开发的深入研究。

结果:

invoke:Emp [uname=null, job=null]
fiels:private java.lang.String 反射与单级类.Emp.uname
method:public void 反射与单级类.Emp.setUname(java.lang.String)
invoke:Emp [uname=syf, job=null]
fiels:private java.lang.String 反射与单级类.Emp.job
method:public void 反射与单级类.Emp.setJob(java.lang.String)
Emp [uname=syf, job=student]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值