标题:
在JAVA编程过程中的高级技巧:JAVA的反射机制!
[打印本页]
作者:
会飞的蚂蚁
时间:
2007-6-7 15:48
标题:
在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]
作者:
andylee
时间:
2007-6-7 16:57
标题:
re:绝对的好东东,给JAVA的学习爱好者带来...
作者:
fghser
时间:
2007-6-7 17:03
标题:
re:看了下,受益匪浅。
作者:
游客
时间:
2007-12-5 23:29
标题:
re:使用开发工具Elipse,运行时总报ja...
欢迎光临 珩源工控论坛 (http://bbs.hymcu.com/)
Powered by Discuz! 7.2