温故而知新 一 jar包反编译 并直接修改字节码文件
最近闲了下来,有时间整理一下之前的项目,之前有封装的jar包,用jd-gui 查看源码,发现源码的方法里只有一个方法名,整个方法里都是//注释掉的效果,代码是如何执行的呢?
public Map getORAPageSet(String sql, int pageNo, int pageSize) throws JDBCException { // Byte code:// 0: getstatic 44 com/jy/framework/util/DBTool:log Lorg/apache/commons/logging/Log;// 3: invokeinterface 83 1 0// 8: ifeq +12 -> 20// 11: getstatic 44 com/jy/framework/util/DBTool:log Lorg/apache/commons/logging/Log;// 14: aload_1// 15: invokeinterface 87 2 0// 20: aconst_null// 21: astore 4// 23: aconst_null// 24: astore 5// 26: aconst_null// 27: astore 6// 29: aconst_null// 30: astore 7// 32: aconst_null// 33: astore 8// 35: ldc 195// 37: astore 9// 39: iconst_1// 40: istore 10// 42: iload_3// 43: iconst_1// 44: if_icmpge +13 -> 57
经研究 、是反编译工具的问题,jd-gui 有时候不太好用,换成Luyten问题解决,方法里都是正常的代码。
public Map getORAPageSet(final String sql, final int pageNo, final int pageSize) throws JDBCException {if (DBTool.log.isDebugEnabled()) {DBTool.log.debug((Object)sql);}Connection conn = null;PreparedStatement prestmt = null;HashMap hashmap = null;CachedRowSet wrset = null;ResultSet rset = null;try {String sbak = "";int actualPageNo = 1;if (pageSize < 1) {throw new JDBCException("\u9875\u9762\u5927\u5c0f(pageSize)\u4e0d\u80fd\u4e3a0\u6216\u8005\u4e3a\u8d1f\u6570\uff01");}conn = this.getConnection();sbak = "Select Count(*) from (" + sql + ")";prestmt = conn.prepareStatement(sbak);rset = prestmt.executeQuery();final int recTotal = rset.next() ? rset.getInt(1) : 0;final int pageTotal = (recTotal - 1) / pageSize + 1;rset.close();actualPageNo = ((pageNo < 1) ? 1 : ((pageNo > pageTotal) ? pageTotal : pageNo));sbak = "Select * from (Select chinarailoriginaltable.*,rownum as orarownum from (" + sql + ") chinarailoriginaltable where rownum < " + String.valueOf(actualPageNo * pageSize + 1) + ") where orarownum >= " + String.valueOf((actualPageNo - 1) * pageSize + 1);prestmt = conn.prepareStatement(sbak);rset = prestmt.executeQuery();wrset = new CachedRowSet();wrset.populate(rset);rset.close();hashmap = new HashMap();hashmap.put("PageNo", new Integer(pageNo));hashmap.put("PageTotal", new Integer(pageTotal));hashmap.put("RecTotal", new Integer(recTotal));hashmap.put("RowSet", wrset);}catch (JDBCException e) {DBTool.log.error((Object)e.getMessage());throw e;}
第二个问题 现在想修改jar里面的 .class文件,经研究 下载软件 JByteMod ,可以直接修改字节码文件,然后保存后,项目引用 ,问题解决。

评论
