以前用的jad158,觉得不错。可这次反编译一个class时(23KB),有一些问题,出现了很多奇怪的符号如“_L5”、“_L2”,还有一些this, continue等语句单独占一行,以及一些goto语句。所以,反编译出来的java文件根本没法用了...哪位大牛能给推荐一两个好些的反编译工具?另,我的class文件是JDK1.5的。

解决方案 »

  1.   

    dj 不错 很好用的 我一直用  msn:[email protected]
      

  2.   

    jad,他唯一一个问题就是反编译那种异常套异常的时候会有问题
      

  3.   

    用什么都会出现你说的效果这都是反编译造成的  特别是我们在网上下载的项目  都会出现主要都是在 try{}catch(){}finally{}  这些地方出问题你只要经常写项目 就会知道哪些地方该抛出异常  自己就能改了看看这篇文章,对你有些帮助http://blog.csdn.net/z3h/archive/2008/07/11/2640522.aspx或者你可以Google一下java class代码反编译后还原
      

  4.   

     jad 不错,还有在eclipse中的插件。可以在eclipse中,随意的阅读jar中的class。
      

  5.   

    jd-gui.exe
      

  6.   

    我今天正好再该以前的一个项目 就出现了你说的问题
    现在我就贴出来  供你参考
    反编译后的代码
    public User FindByCode(String user_code)
            throws SQLException
        {
            String qstr;
            Statement stmt;
            ResultSet rs;
            User user;
            qstr = String.valueOf(String.valueOf((new StringBuffer("select  ,user_code,user_pin,user_sex,user_duty,user_person,user_email,user_phone,user_address,re1,re2,re3,user_del from USER_TABLE where user_code = '")).append(user_code).append("'")));
            stmt = null;
            rs = null;
            user = null;
            SQLException se;
            try
            {
                getConnection();
                stmt = dbConnection.createStatement();
                for(rs = stmt.executeQuery(qstr); rs.next();)
                {
                    int i = 1;
                    int user_id = rs.getInt(i++);
                    String user_name1 = rs.getString(i++);
                    String user_code1 = rs.getString(i++);
                    String user_pin1 = rs.getString(i++);
                    String user_sex1 = rs.getString(i++);
                    String user_duty1 = rs.getString(i++);
                    String user_person1 = rs.getString(i++);
                    String user_email1 = rs.getString(i++);
                    String user_phone1 = rs.getString(i++);
                    String user_address1 = rs.getString(i++);
                    String re11 = rs.getString(i++);
                    String re21 = rs.getString(i++);
                    String re31 = rs.getString(i++);
                    String user_del1 = rs.getString(i++);
                    user = new User(user_id, user_name1, user_code1, user_pin1, user_sex1, user_duty1, user_person1, user_email1, user_phone1, user_address1, re11, re21, re31, user_del1);
                }        }        其实是这个位置少了一catch,然后将下面的那两个删掉就好了
            finally
            {
                closeResultSet(rs);
                closeStatement(stmt);
                closeConnection();
            }
            break MISSING_BLOCK_LABEL_372;                     这个位置有问题吧
            se;
            System.out.print("userdb find by code fail".concat(String.valueOf(String.valueOf(se.getMessage()))));
            return user;
        }这是修改后的代码
    public User FindByCode(String user_code)
            throws SQLException
        {
            String qstr;
            Statement stmt;
            ResultSet rs;
            User user;
            qstr = String.valueOf(String.valueOf((new StringBuffer("select user_id,user_name,user_code,user_pin,user_sex,user_duty,user_person,user_email,user_phone,user_address,re1,re2,re3,user_del from USER_TABLE where user_code = '")).append(user_code).append("'")));
            stmt = null;
            rs = null;
            user = null;
            try
            {
                getConnection();
                stmt = dbConnection.createStatement();
                for(rs = stmt.executeQuery(qstr); rs.next();)
                {
                    int i = 1;
                    int user_id = rs.getInt(i++);
                    String user_name1 = rs.getString(i++);
                    String user_code1 = rs.getString(i++);
                    String user_pin1 = rs.getString(i++);
                    String user_sex1 = rs.getString(i++);
                    String user_duty1 = rs.getString(i++);
                    String user_person1 = rs.getString(i++);
                    String user_email1 = rs.getString(i++);
                    String user_phone1 = rs.getString(i++);
                    String user_address1 = rs.getString(i++);
                    String re11 = rs.getString(i++);
                    String re21 = rs.getString(i++);
                    String re31 = rs.getString(i++);
                    String user_del1 = rs.getString(i++);
                    user = new User(user_id, user_name1, user_code1, user_pin1, user_sex1, user_duty1, user_person1, user_email1, user_phone1, user_address1, re11, re21, re31, user_del1);
                }        }catch(SQLException e){
             System.out.print("userdb find by code fail".concat(String.valueOf(String.valueOf(e.getMessage()))));
            }
            finally
            {
                closeResultSet(rs);
                closeStatement(stmt);
                closeConnection();
            }       
            return user;
        }
      

  7.   

    这是另外的一个例子   看了会更晕!!!!
    这是反编译后的代码
    private void deleteUser(int user_id)
            throws SQLException
        {
            PreparedStatement stmt;
            String queryStr;
            stmt = null;
            int resultCount = 0;
            queryStr = "update  user_table set user_del = '1' WHERE user_id = ? ";
            getConnection();
            stmt = dbConnection.prepareStatement(queryStr);
            stmt.setInt(1, user_id);
            int resultCount = stmt.executeUpdate();
            if(resultCount < 1)
                System.out.print("".concat(String.valueOf(String.valueOf(resultCount))));
            SQLException se;     这个位置删掉
            try
            {
                if(stmt != null)
                    stmt.close();
            }
            // Misplaced declaration of an exception variable
            catch(SQLException se)
            {
                System.out.print(":".concat(String.valueOf(String.valueOf(se.getMessage()))));
            }
            break MISSING_BLOCK_LABEL_228;
            se;
            System.out.print(":".concat(String.valueOf(String.valueOf(se.getMessage()))));
            try
            {
                if(stmt != null)
                    stmt.close();
            }
            catch(SQLException se)
            {
                System.out.print(":".concat(String.valueOf(String.valueOf(se.getMessage()))));
            }
            break MISSING_BLOCK_LABEL_228;
            Exception exception;
            exception;
            try
            {
                if(stmt != null)
                    stmt.close();
            }
            catch(SQLException se)
            {
                System.out.print(":".concat(String.valueOf(String.valueOf(se.getMessage()))));
            }
            throw exception;
            return;
        }这是改过后的代码private void deleteUser(int user_id)
            throws SQLException
        {
            PreparedStatement stmt;
            String queryStr;
            stmt = null;
            int resultCount = 0;
            queryStr = "update  user_table set user_del = '1' WHERE user_id = ? ";
            try
            {
            getConnection();
            stmt = dbConnection.prepareStatement(queryStr);
            stmt.setInt(1, user_id);
            resultCount = stmt.executeUpdate();
            if(resultCount < 1)
                System.out.print("".concat(String.valueOf(String.valueOf(resultCount))));
        }
            catch(SQLException se)
            {
                System.out.print("".concat(String.valueOf(String.valueOf(se.getMessage()))));
            }finally{
             try
                {
                    if(stmt != null)
                        stmt.close();
                    closeConnection();
                }
                catch(SQLException se)
                {
                    System.out.print("".concat(String.valueOf(String.valueOf(se.getMessage()))));
                }
            }        
        }
    好好看看吧 也许会对你有些帮助
      

  8.   

    大家都用小颖啊
    我的这些代码就是用小颖编译后得出的结果有的没问题  有的就有问题就是对异常的处理你先把那些没用的东西都删掉  然后根据自己的经验重新try catch finally 就OK!!了