现在所有的操作是通过TestDemo类调⽤EmpAction类实现的,⽽EmpAction类的主要作⽤是在于定位要操作的属性类型。同时该程序应该符合于所有简单的Java类开发形式,因此对于我们的设计⽽⾔必须有⼀个单独的类(BeanOperation)(实现此适配。范例:Emp类设计(简单Java类)
1.员工信息类(简单Java类)
public class Emp {
private String ename;
private String job;
public String getName() {
return ename;
}
public void setName(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String toString() {
return "Emp{" +
"ename='" + ename + '\'' +
", job='" + job + '\'' +
'}';
}
}
2. 定位要操作的属性类型
import java.lang.reflect.InvocationTargetException;
//操作Emp的类,提供给用户使用
public class EmpAction {
private Emp emp=new Emp ();
public void setEmpValue(String value) throws InvocationTargetException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException {
BeanUtil.setBeanValue(this,value);
}
public Emp getEmp(){
return emp;
}
}
3.单独的类(BeanOperation)(实现此适配)
//操作简单类属性设置的工具类
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BeanUtil {
private BeanUtil() {
}
//actionObj拿到提供给用户使用的XXAction类
//beanValue要设置的具体值
//emp.name:dange|emp.job:Coder
public static void setBeanValue(Object actionObject, String msg) {
//1.字符串拆分
String[] result = msg.split ( "\\|" );
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split ( ":" );
String attribute = temp[0];
String value = result[1];
String[] fields = attribute.split ( "\\." );
Object currentObject = null;
try {
currentObject = getObject ( actionObject, fields[0] );
} catch (InvocationTargetException e) {
e.printStackTrace ( );
} catch (IllegalAccessException e) {
e.printStackTrace ( );
}
try {
setObjectValue ( currentObject, fields[1], temp[1] );
} catch (NoSuchFieldException e) {
e.printStackTrace ( );
} catch (NoSuchMethodException e) {
e.printStackTrace ( );
} catch (InvocationTargetException e) {
e.printStackTrace ( );
} catch (IllegalAccessException e) {
e.printStackTrace ( );
}
}
}
private static String initCap(String str) {
return str.substring ( 0, 1 ).toUpperCase ( ) + str.substring ( 1 );
}
//根据Xxaction类取得真正操作的主题类Emp
//通过反射调用getEmp()
private static Object getObject(Object obj, String attribute) throws InvocationTargetException, IllegalAccessException {
//方法名
String methodName = "get" + initCap ( attribute );
Field field = null;
try {
field = obj.getClass ( ).getDeclaredField ( attribute );
} catch (NoSuchFieldException e) {
e.printStackTrace ( );
}
if (field == null) {
try {
field = obj.getClass ( ).getDeclaredField ( attribute );
} catch (NoSuchFieldException e) {
e.printStackTrace ( );
}
}
if (field == null) {
return null;
}
Method method = null;
try {
method = obj.getClass ( ).getMethod ( methodName );
} catch (NoSuchMethodException e) {
e.printStackTrace ( );
}
try {
return method.invoke ( obj );
} catch (IllegalAccessException e) {
e.printStackTrace ( );
} catch (InvocationTargetException e) {
e.printStackTrace ( );
}
return method.invoke ( obj );
}
public static void setObjectValue(Object obj, String attribute, String value) throws NoSuchFieldException,
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Field field = obj.getClass ( ).getDeclaredField ( attribute );
if (field == null) {
field = obj.getClass ( ).getField ( attribute );
}
if (field == null) {
return;
}
String methodName = "set" + initCap ( attribute );
Method setMethod = obj.getClass ( ).getMethod ( methodName, field.getType ( ) );
setMethod.invoke ( obj, value );
}
}
4.测试类
import java.lang.reflect.InvocationTargetException;
public class Test{
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
String str="emp.ename:dange|emp.job:Java Coder";
EmpAction empAction=new EmpAction ();
empAction.setEmpValue ( str);
System.out.println (empAction.getEmp () );
}
}