自动填充属性值【反射:调用必须存在对象,成员变量、方法、构造函数都是以对象的形式调用{一切皆对象} 】
- Emp.java
package reflect;
public class Emp {
private String ename;
private String job;
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "Emp [ename=" + ename + ", job=" + job + "]";
}
}
- EmpAction.java
package reflect;
import util.BeanOperation;
public class EmpAction {
private Emp emp = new Emp();
public Emp getEmp() {
return emp;
}
public void setBeanValue(String msg) throws Exception {
BeanOperation.setBenValue(this, msg);
}
}
- BeanOperation.java
package util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import reflect.EmpAction;
//emp.ename:caoqian|emp.job.leader
public class BeanOperation {
private BeanOperation() {
}
public static void setBenValue(Object objectAction, String msg) throws Exception {
String[] result = msg.split("\\|");
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split(":");
// 取得真实的属性值
String value = temp[1];
String[] finalresult = temp[0].split("\\.");
// 真实类名
String realClassName = finalresult[0];
// 属性名称
String attr = finalresult[1];
Object realobject = getRealObject(objectAction, realClassName);
System.out.println(realobject);
String realattr = finalresult[1];
// 取得属性对象
Field realfield = realobject.getClass().getDeclaredField(realattr);
String setmethodName = "set" + Initcap(realattr);
Method setmethod = realobject.getClass().getDeclaredMethod(setmethodName, realfield.getType());
setmethod.invoke(realobject, value);
}
}
public static Object getRealObject(Object objectAction, String realClassName) throws Exception {
Object realobject = null;
Class<?> cls = objectAction.getClass();
Field field = cls.getDeclaredField(realClassName);
if (field == null) {
field = cls.getField(realClassName);
if (field == null) {
return null;
}
} else {
String MethodName = "get" + Initcap(realClassName);
Method method = cls.getMethod(MethodName);
realobject = method.invoke(objectAction);
}
return realobject;
}
private static String Initcap(String realClassName) {
return realClassName.substring(0, 1).toUpperCase() + realClassName.substring(1);
}
}
- Test.java
package reflect;
public class Test {
public static void main(String[] args) throws Exception {
String msg = "emp.ename:caoqian|emp.job:leader";
EmpAction empAction = new EmpAction();
empAction.setBeanValue(msg);
System.out.println(empAction.getEmp());
}
}
- 遇到的错误:
(一)ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
(二)InstantiationException :当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。