版权声明:白小姐 https://blog.csdn.net/bailerong123/article/details/88935715
文章目录
没有我们的反射就没有我们的开发框架
反射与简单java类
反射与VO操作
如果现在又一个简单java类,按照原始的做法使用getter与setter对属性进行操作
基本程序:
/*
* 这是我们的一个关于基础操纵的代码,getter和setter方法
* */
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 + '\'' +
'}';
}
}
public class baseTest {
public static void main(String[] args) {
Emp emp=new Emp();
emp.setEname("lele");
emp.setJob("student");
System.out.println(emp);
}
}
假设一个类之中又几十个属性,要按照原始做法来看,要调用几十次setter方法,这样的操作太过于麻烦。
我们希望能够对程序做简化,输入字符串"属性名称:属性值 | 属性名称:属性值| …",就可以将类中的属性设置好。希望通过此程序实现任意的简单java类的属性设置
现在所有的操作是通过TestDemo类调用EmpAction类实现的,而EmpAction类的主要作用时在于定位要操作的属性类型。同时该程序应该符合所有简单java类开发形式,因此对于我们的设计而言必须有一个单独的类(BeanOperation)(实现此适配)
package vo;
public class Emp {
private String name;
private String subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", subject='" + subject + '\'' +
'}';
}
}
package vo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
* 本类主要负责实现自动的VO匹配处理
*
*/
public class BeanOperation {
private BeanOperation(){}
/*
* 负责设置类中的属性操作
* actionObject表示当前发出设置请求的程序类的当前对象
* msg属性的具体内容,格式为:“属性名称:|内容|属性名称:|内容..”
* */
public static void setBeanValue(Object actionObject,String msg) throws Exception {
//要进行内容的设置,必须将字符串拆分
//按照竖线拆分,取出所有要设置的内容
String[] result=msg.split("\\|");
//每次执行后只剩下“属性名称:内容”
for(int i=0;i<result.length;i++){
//需要针对属性以及内容做进一步的拆分
String[] temp=result[i].split(":");
//属性名称 :"emp.ename"
String attribute=temp[0];
//属性内容
String value=temp[1];
String[] fields=attribute.split("\\.");
//获取当前操作的简单java类对象
Object currentObject=getObject(actionObject,fields[0]);
//调用简单java类的setter方法
setObjectValue(currentObject,fields[1],temp[1]);
}
}
/*
将给定的字符串的首字母大写
str 给定的字符串
return 返回首字母大写的字符串
* */
public static String initCap(String str){
return str.substring(0,1).toUpperCase()+str.substring(1);
}
/*
*负责调用XXXAction类中的getter方法取得简单的java类对象
* obj 表示调用方法所在类对象
* attribute表示属性名称
* return 调用对象结果
*/
public static Object getObject(Object obj,String attribute) throws Exception {
String methodName="get"+initCap(attribute);
//调用指定属性的Field对象,目的是取得对象类型,
// 如果没有此属性意味着操作无法继续进行
Field field=obj.getClass().getDeclaredField(attribute);
if(field==null){
//第二次尝试从父类中取得该属性
field=obj.getClass().getField(attribute);
}
if(field==null){
//如果两次都没有取得指定的属性,表示该对象一定不存在
return null;
}
Method method=obj.getClass().getMethod(methodName);
return method.invoke(obj);
}
/*
根据指定的类对象设置指定类中的书香,调用setter方法
obj 属性所在类的实例化对象
attribute 属性名称
value 属性内容
*/
public static void setObjectValue(Object obj, String attribute,String value) throws Exception {
Field field=obj.getClass().getDeclaredField(attribute);
if(field==null){
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);
}
}
package vo;
public class EmpAction {
private Emp emp=new Emp();
public void setValue(String value) throws Exception {
BeanOperation.setBeanValue(this,value);
}
public Emp getEmp(){
return emp;
}
}
package vo;
public class TestDemo {
public static void main(String[] args) throws Exception {
String value="emp.name:lele|emp.subject:java Coder";
EmpAction empAction=new EmpAction();
empAction.setValue(value);
System.out.println(empAction.getEmp());
}
}
运行结果:
Emp{name='lele', subject='java Coder'}
Process finished with exit code 0