java中的反射机制一直被很多框架所应用,但我们很少接触,所以显得很神秘。今天我根据我做的一个实际的列子和大家一起来讨论下如何使用method来反射类的方法。
项目描述:在web工程中,数据库内有一张student表,简单对student表进行IUSD操作,
目的:只使用一个Servlet(或者action, 也不使用动态的Action)使用动态的action也可以实现此功能,但我觉得使用反射,视图层的代码简单得多,并且与业务逻辑无管,很好的进行了松耦.
代码:1 servlet 层里的
//获得页面的信息
String sName = request.getParameter("sname");--页面中sname的值
String sid = request.getParameter("sid");--页面中sid的值
String sdesc = request.getParameter("sdesc");--页面中sdesc的值
String mothod = request.getParameter("mothod"); --页面中的隐藏表单 请确保它与我们的实体逻辑类的方法名一致,
//封装界面信息
JstudentBean stu= new JstudentBean (); --JstudentBean 是一个简单的javabean 封装student的信息
stu.setId(slid);
stu.setName(sName);
stu.setDesc(sdesc);
//调用映射类 实现业务逻辑处理
stuMethed meth = new stuMethed();
meth.excute(mothod,stu);
2:映射控制类
public class stuMethed{
stuDelegate delegate = null; --stuDelegate 它调用持久层的类来完成student的持久化操作
public stuMethed() { --构造时注入工作对象(使用spring可以很方便的实现构造注入解耦)
delegate = new stuDelegate ();
}
public Object excute(String methodfid,JstudentBean cla){
Object obj = null;
try {
Method method = stuDelegate .class.getMethod(methodfid,
new Class[] {JstudentBean .class}); --得到与页面中的methodfid 名字相同的 方法的引用
第一个参数是 stuDelegate 中的方法名,第二个参数是 改方法中的参数
obj = method.invoke(delegate,new Object[]{cla}); --调用 methodfid 的方法
} catch (Exception ex) {
}
return obj;
}
}
3:业务逻辑与持久层联系的类 实际工作的是这个类,我这里就简单写几个方法,你写的时候注意调用持久层的对象来实现student的持久化操作(持久化操作可以是DAO模式,或hibernate,或ejb 随便你选择)
public class stuDelegate {
public void addstu(JstudentBean cla){}
public void deletestu(JstudentBean cla) {}
public void findstubyPk(JstudentBean cla) {}
public void updatestu(JstudentBean cla) {}
}
你在stuDelegate 写的方法名就是在jsp页面中mothod 隐藏域中可以选择的值,如果你想增加其他的方法,只需要在stuDelegate 中增加一个与页面中mothod 字段值对应的方法,其他的代码都不用更改,是不是比动态的action还方便呢,一个简单的反射控制类,使我们的servlet里的代码简介,明了。反射真的是很不错的东西,,
其实很多框架中大量的使用了反射,来简化程序的开发。这个列子是我学习spring和ejb中偶然想到的。一写还真写成功了。代码比较简陋,希望得到大家的指点。。。
东西比较乱,也不知道有没有把我想表达的意识表达清楚,有什么不懂的地方,或者你有更好的解决办法,请不要吝啬你的文字,留言告诉我。。