温故而知新 一 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 ,可以直接修改字节码文件,然后保存后,项目引用 ,问题解决。
评论