- 帖子
- 20
- 主题
- 14
- 精华
- 0
- 积分
- 56
- 在线时间
- 584 小时
- 注册时间
- 2007-6-4
|
在JAVA编程过程中的高级技巧:JAVA的反射机制!
JAVA的反射机制,是我来到中软后才深入了解到的,开始的时候,我并没有深入的了解,基本上都是按照自己的思路去编写,有的时候,所写的程序非常的麻烦,而且运行的效率也很底,可读性也不高,如果我们在编写一个程序时,能运用到JAVA的反射机制,不仅能节约你的时间,而且使你所编写的程序的可读性大大的提高,比如:下面这个例子(我亲手编的):
这个是没有用JAVA反射机制的情况下,把后台传来的数据信息,对前台的界面进行数据更新和显示,可以看出这样显得比较复杂,并且可读性也比较差。
/*
*这是从后台数据库到BLH(Enterty Bean:实体Bean),
再到session bean(会话Bean),最后传到Action,对事件的处理。
把传过来数据信息封装在一个ArrayList中了。
*
*/
ArrayList arraycjsList = fcythcjsResEvent.getArraycjsList();//这是从BLH中传递过来的一个用List来封装的数据信息。fcythcjsResEvent这个只是一个用来传递数据的一个工具。
public void initCjsmx(arraycjsList){
// 显示承建商明细信息
ArrayList arraycjsData = new ArrayList();//为了对Table的个列进行赋值,首先应建立一个ArrayList对象,用来封装HashMap数据信息。
HashMap datacjsMap = null;//建立一个HashMap变量,后面会对这个变量建立对象用来封装从VO过来的数据信息。
/*
*建立一个循环,把从数据库传过来的多个数据信息,用HashMap进行封装。
*
*/
for (int i = 0; i < arraycjsList.size(); i++) {
datacjsMap = new HashMap();
jzsmxVO = (FcythjzsmxVO) arraycjsList.get(i);//从List中取得封装的VO(如果数据库的表里有多个数据,则可能是多个VO)。
//下面是对VO中的数据进行封装,这是为了便于把数据更新到Table中。
datacjsMap.put("zxmbh", jzsmxVO.getZxmbh());
datacjsMap.put("cjgcnr", jzsmxVO.getCjgcnr());
datacjsMap.put("cjsnsrsbh", jzsmxVO.getCjsnsrsbh());
datacjsMap.put("cjsnsrmc", jzsmxVO.getCjsnsrmc());
datacjsMap.put("sgm", jzsmxVO.getSgm());
datacjsMap.put("sgxkzh", jzsmxVO.getSgxkzh());
datacjsMap.put("xmjsfs", jzsmxVO.getXmjsfs());
datacjsMap.put("cbfs", jzsmxVO.getCbfs());
datacjsMap.put("hth", jzsmxVO.getHth());
datacjsMap.put("htzje", new Double(jzsmxVO.getHtzje()));
datacjsMap.put("htkgrq", jzsmxVO.getHtkgrq());
datacjsMap.put("htjgrq", jzsmxVO.getHtjgrq());
datacjsMap.put("cjsnsrgljg", jzsmxVO.getCjsnsrgljg());
datacjsMap.put("cjsssgly", jzsmxVO.getCjsssgly());
arraycjsData.add(datacjsMap);//把HashMap封装在一个List中。
// ttJzsmx.appendRow();
// ttJzsmx.setValueAt(jzsmxVO.getZxmbh(), i, "zxmbh");
// ttJzsmx.setValueAt(jzsmxVO.getCjgcnr(), i, "cjgcnr");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrsbh(), i, "cjsnsrsbh");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrmc(), i, "cjsnsrmc");
// ttJzsmx.setValueAt(jzsmxVO.getSgm(), i, "sgm");
// ttJzsmx.setValueAt(jzsmxVO.getSgxkzh(), i, "sgxkzh");
// ttJzsmx.setValueAt(jzsmxVO.getXmjsfs(), i, "xmjsfs");
// ttJzsmx.setValueAt(jzsmxVO.getCbfs(), i, "cbfs");
// ttJzsmx.setValueAt(jzsmxVO.getHth(), i, "hth");
// ttJzsmx.setValueAt(new Double(jzsmxVO.getHtzje()), i, "htzje");
// ttJzsmx.setValueAt(jzsmxVO.getHtkgrq(), i, "htkgrq");
// ttJzsmx.setValueAt(jzsmxVO.getHtjgrq(), i, "htjgrq");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrgljg(), i, "cjsnsrgljg");
// ttJzsmx.setValueAt(jzsmxVO.getCjsssgly(), i, "cjsssgly");
}
if (arraycjsData.size() > 0) {//判断这个List是否为空,如果为空不执行赋值操作。
ttJzsmx.setValue(arraycjsData);//对Table进行更新数据,显示数据信息。
ttJzsmx.refleshTable();//对Table界面进行数据刷新。
}
}
下面这个程序是运用JAVA反射机制,来对上面的这个程序进行重新编写。和上面我开始编的这个程序,相比较,就能看到这个反射机制的好处了。
/*
*这是从后台数据库到BLH(Enterty Bean:实体Bean),
再到session bean(会话Bean),最后传到Action,对事件的处理。
把传过来数据信息封装在一个ArrayList中了。
*
*/
ArrayList arraycjsList = fcythcjsResEvent.getArraycjsList();//这是从BLH中传递过来的一个用List来封装的数据信息。fcythcjsResEvent这个只是一个用来传递数据的一个工具。
public void initCjsmx(arraycjsList){
// 显示承建商明细信息
ArrayList arraycjsData = new ArrayList();//为了对Table的个列进行赋值,首先应建立一个ArrayList对象,用来封装HashMap数据信息。
HashMap datacjsMap = null;//建立一个HashMap变量,后面会对这个变量建立对象用来封装从VO过来的数据信息。
/*
*建立一个循环,把从数据库传过来的多个数据信息,用HashMap进行封装。
*
*/
for (int i = 0; i < arraycjsList.size(); i++) {
datacjsMap = new HashMap();
jzsmxVO = (FcythjzsmxVO) arraycjsList.get(i);//从List中取得封装的VO(如果数据库的表里有多个数据,则可能是多个VO)。
//下面是对VO中的数据进行封装,这是为了便于把数据更新到Table中。
datacjsMap = setUITableRowValueByVO(jzsmxVO,TbCjsmx);//JAVA反射机制的优势就在这里,我直接调用下面我事先编写好的一个公用方法。而不需要一个一个的再进行影射了。这样一步就可以完成。
arraycjsData.add(datacjsMap);//把HashMap封装在一个List中。
// ttJzsmx.appendRow();
// ttJzsmx.setValueAt(jzsmxVO.getZxmbh(), i, "zxmbh");
// ttJzsmx.setValueAt(jzsmxVO.getCjgcnr(), i, "cjgcnr");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrsbh(), i, "cjsnsrsbh");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrmc(), i, "cjsnsrmc");
// ttJzsmx.setValueAt(jzsmxVO.getSgm(), i, "sgm");
// ttJzsmx.setValueAt(jzsmxVO.getSgxkzh(), i, "sgxkzh");
// ttJzsmx.setValueAt(jzsmxVO.getXmjsfs(), i, "xmjsfs");
// ttJzsmx.setValueAt(jzsmxVO.getCbfs(), i, "cbfs");
// ttJzsmx.setValueAt(jzsmxVO.getHth(), i, "hth");
// ttJzsmx.setValueAt(new Double(jzsmxVO.getHtzje()), i, "htzje");
// ttJzsmx.setValueAt(jzsmxVO.getHtkgrq(), i, "htkgrq");
// ttJzsmx.setValueAt(jzsmxVO.getHtjgrq(), i, "htjgrq");
// ttJzsmx.setValueAt(jzsmxVO.getCjsnsrgljg(), i, "cjsnsrgljg");
// ttJzsmx.setValueAt(jzsmxVO.getCjsssgly(), i, "cjsssgly");
}
if (arraycjsData.size() > 0) {//判断这个List是否为空,如果为空不执行赋值操作。
ttJzsmx.setValue(arraycjsData);//对Table进行更新数据,显示数据信息。
ttJzsmx.refleshTable();//对Table界面进行数据刷新。
}
}
/**
* 功能描述:使用反射机制,实现将VO中封装的表格列的信息封装到map中,
* 需要在controller中循环调用该方法
* 将封装在voList中的所有信息封装在mapList中,再填写在表格中
* @param vo BaseValueObject
* @param tb 表
* @return map
*/
public static Map setUITableRowValueByVO(BaseValueObject vo, TAXTable tb) {
Map map = new HashMap();
//得到vo中的所有方法
java.lang.reflect.Method[] methods = vo.getClass().getMethods();
//得到包含所有字段名的ArrayList
ArrayList colNameList = tb.getAllColIDs();
// ArrayList colNameList = voToMap(vo);
for (int k = 0; k < methods.length; k++) {
String methodName = methods[k].getName();//获得所有方法的名称
if (methodName.startsWith("get")) {//返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
//取出get后的字符,头字母大写
String voGetter = methodName.trim().substring(3);//从第四个字母开始(是从0开始的。)到字符串的末尾,进行截取
//头字母小写
voGetter = voGetter.substring(0, 1).toLowerCase() +
voGetter.substring(1);//对String类型的数据取子集,并使第一个字母变成小写。
for (int j = 0; j < colNameList.size(); j++) {
String colName = (String)colNameList.get(j);
if (voGetter.equals(colName)) {//判断是否相同
try {
//得到方法的返回值类型
Class returntype = methods[k].getReturnType();//获得方法返回的类型。
Object o = methods[k].invoke(vo, null);//对带有指定参数的指定对象调用由此 Method 对象表示的基础方法。因为这里是静态的方法,所以第二个参数为null。
if (returntype.getName().equals("java.lang.String")) {
o = CommFunctions.strPd(o);
} else if (returntype.getName().equals(
"java.util.Calendar")) {
o = CommFunctions.calePd(o);
} else if (returntype.getName().equals("double")) {
o = new Double(CommFunctions.douPd(o));
} else if (returntype.getName().equals("long")) {
o = new Long(CommFunctions.longPd(o));
} else if (returntype.getName().equals("int")) {
o = new Integer(CommFunctions.intPd(o));
}
LogWritter.bizDetailInfo("--------" +
methods[k].getName() +
":" + methods[k].invoke(vo, null));
map.put(colName, o);
} catch (Exception e) {
continue;
}
} //if
} //for
} //if
} //for
return map;
}
上面的这两个程序的比较,请大家好好的体会一下。当然其中有的类,可能大家没见过,不过没关系的。因为这里面有一些是专门某个门类的API,这个程序也可能不能在你的
IDE环境中运行,因为在你的IDE环境中没有加载税务系统的特殊的JAR包。无法进行编译。不过,我在上面给大家做了很详细的注释,我想只要是有点JAVA基础的朋友,都能看懂。
如果有不明白的地方,请给我留言,我会给大家解答的。这个反射机制,用处很大的。希望大家能好好的掌握住哦!嘿嘿。关于JAVA反射机制的具体用法,见我上传的文件。
此主题相关文件 [url=leadbbsfile/upload/2007/06/07/154833.doc]154833.rar[/url]
下载后请把154833.doc重命名为154833.rar就可以解压看到了[/COLOR]
此主题相关文件 [url=leadbbsfile/upload/2007/06/07/143503.doc]143503.rar[/url]
下载后请把143503.doc重命名为143503.rar就可以解压看到了[/COLOR]
|
|