对于一个Emp类:
public class Emp {
private String name;
private String job;
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;
}
@Override
public String toString() {
return "[name:"+name+" ,job:"+job+"]";
}
}
可以通过实例化类对象通过getter()和setter()方法给属性赋值。
但是如果一个类有很多的属性,那么在主类中调用很多次的getter()和setter()方法,不仅操作麻烦,还会产生很多的代码。
所以为了简化,只需要输入字符串"属性名:属性值|属性名:属性值|属性名:属性值|..."一次将属性赋值。
反射实现单级VO的操作步骤:
(1)具体类(Emp):定义所需要的所有属性,以及个属性的getter()和setter()方法。并覆写toString方法
(2)Test类():该类中的主方法通过实例化第三方类EmpAction类的对象,从而调用EmpAction类的用于接收字符串的方法.
(3)EmpAction类:该类需要实例化具体类Emp类的对象,用于反射操作中的使用;定义一个方法用于接收在主方法中传入的字符串,在该方法中调用实现解耦的BeanOperation类的一个方法,从而利用BeanOperation类中的方法操作该字符串;再定义一个方法用于通过反射取得Emp类对象以及打印具体类Emp类的对象从而判断是否将各属性设置成功
(4)工具类(BeanOperation类):该类用于真正实现字符串内容到各属性值设置的操作的类
主类:
public class Test {
public static void main(String[] args) throws Exception {
String msg="emp.name:holle|emp.job:Linux";
EmpAction empAction=new EmpAction();
empAction.getInstance(msg);
System.out.println(empAction.getEmp());
}
}
第三方类:EmpAction类。
public class EmpAction {
private Emp emp;
public void getInstance(String msg) throws Exception
{
BeanOperation.getBeanOperation(this,msg);
}
public Emp getEmp() {
return emp;
}
}
第三方类和真正操作的方法实现解耦的工具类(BeanOperation类)。
/*
* 本类负责实现自动的VO匹配处理操作
*/
public class BeanOperation {
private BeanOperation()
{
}
/*
* 负责类中的属性操作
* object表示当前发出设置请求的程序类的当前对象
* msg属性的具体内容,格式为:"属性名称:内容|属性名称:内容"
*/
public static void getBeanOperation(Object object,String msg)throws Exception
{
//第一次拆分:按照“|”拆
String[] realstring=msg.split("\\|");
for(int i=0;i<realstring.length;i++)
{
//第二次拆分:按照“:”拆分,把内容和属性拆开
String[] temp=realstring[i].split(":");
String realstringname=temp[0]; //保存的是类名.属性
String value=temp[1]; //保存的是属性的值
//第三次拆分:将类名和属性名拆开
String[] objectstring=realstringname.split("\\.");
String classstringname=objectstring[0]; //类对象名
String objectstringname=objectstring[1]; //属性名
//获取java类对象
Object realobject=getObject(object, classstringname); //取得对象
//设置类中属性
Field realfield=realobject.getClass().getDeclaredField(objectstringname);
String methodName="set"+initCap(objectstringname);
Method method=object.getClass().getDeclaredMethod(methodName,realfield.getType());
method.invoke(object, value);
}
}
/*
* 将给定字符串的首字母大写
* str给定字符串
* 返回首字母大写的字符串
*/
public static String initCap(String str)
{
return str.substring(0,1).toUpperCase()+str.substring(1);
}
/*
* 负责调用XXXAction类中的getter方法取得简单的java对象
* object表示调用方法的所在类的对象
* classstringname表示属性名称
* 返回调用对象结果
*/
public static Object getObject(Object object,String classstringname) throws Exception
{
Object realobj=null;
Class<?> cls=object.getClass();
Field field=null;
try {
field=cls.getDeclaredField(classstringname); //取得当前类属性
if(field==null)
{
field=cls.getField(classstringname); //当前类没有指定属性就在父类中找,不考虑权限
if(field==null)
{
return null;
}
}else {
//通过方法得到emp对象
String methodName="get"+initCap(classstringname);
Method method=cls.getDeclaredMethod(methodName); //得到类中方法
realobj=method.invoke(object);
}
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return realobj;
}