代码部分:
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]