java封装的jad1.5.8g反编译工具(java如何打开一个选择框)

本文介绍了一个使用Java实现的反编译工具,该工具能够遍历指定目录下的所有.class文件,并利用jad.exe对其进行反编译,同时提供了友好的图形用户界面。

package com.xie.jad;

import java.awt.Color;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.*;

/**
 * java反编译工具的调用
 * 封装了jad1.5.8g
 * @author centre
 *
 */

@SuppressWarnings("serial")
public class JadFrame extends JFrame{
 
 private JLabel lb;
 private JTextField tf;
 private JButton btnOk,btnSect;
 private TextArea ta;
 private JPanel p1,p2;
 private JadFrame jf;
 private void launchFrame(){
  this.setBounds(600, 400, 320, 240);
  this.setTitle("java反编译工具beta2.0");
  //this.setIconImage();
  //this.setLayout(null);
  p1=new JPanel(null);
  p1.setBounds(0, 0, 320, 60);
  p1.setBackground(Color.pink);
  p2=new JPanel(null);
  p2.setBounds(0, 60, 320,180);
  lb=new JLabel("请选择目录:");
  lb.setBounds(0, 20, 70, 20);
  tf=new JTextField("C:/");
  tf.setBounds(70, 20, 110, 20);
  btnOk=new JButton("反编译");
  btnOk.setBounds(240,20, 80, 20);
  btnOk.addActionListener(new DecodeMonitor());
  btnSect=new JButton("选择");
  btnSect.addActionListener(new SelectMonitor());
  btnSect.setBounds(180, 20, 60, 20);
  ta=new TextArea("初始化成功!",23,1);
  ta.setBackground(Color.ORANGE);
  ta.setBounds(0, 60, 320, 160);
  p1.add(lb);
  p1.add(tf);
  p1.add(btnSect);
  p1.add(btnOk);
  p2.add(ta);
  this.add(p1);
  this.add(p2);
  this.addWindowListener(new WindowAdapter() {

   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  this.setResizable(false);
  this.setVisible(true);
 }
 public JadFrame(){
  jf=this;
     launchFrame();
 }

 public JLabel getLb() {
  return lb;
 }
 public void setLb(JLabel lb) {
  this.lb = lb;
 }
 public JTextField getTf() {
  return tf;
 }
 public void setTf(JTextField tf) {
  this.tf = tf;
 }
 public JButton getBtnOk() {
  return btnOk;
 }
 public void setBtnOk(JButton btnOk) {
  this.btnOk = btnOk;
 }
 public JButton getBtnSect() {
  return btnSect;
 }
 public void setBtnSect(JButton btnSect) {
  this.btnSect = btnSect;
 }
 public TextArea getTa() {
  return ta;
 }
 public void setTa(TextArea ta) {
  this.ta = ta;
 }
 public JPanel getP1() {
  return p1;
 }
 public void setP1(JPanel p1) {
  this.p1 = p1;
 }
 public JPanel getP2() {
  return p2;
 }
 public void setP2(JPanel p2) {
  this.p2 = p2;
 }


public static void main(String[] args){
 new JadFrame();
}
/**
 * 选择按钮的监视器
 * @author centre
 *
 */
 class SelectMonitor implements ActionListener{
  
  private JFileChooser chooser;

  @Override
  public void actionPerformed(ActionEvent e) {
   selectDir();
  }
/**
 * @author centre
 *  java如何打开一个选择框 
 */
  private void selectDir(){
   //根据制定目录,打开一个选择框
    chooser = new JFileChooser(tf.getText());
    //选择打开模式,有3中选择,1只打开目录,2只打开文件,3都可以打开
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    //显示的选择框依附于哪个窗口
    int num= chooser.showOpenDialog(jf);
    if (num==JFileChooser.APPROVE_OPTION) {
    tf.setText(chooser.getSelectedFile().getPath());
   }   
  }
  
  
 }
 
 /**
  *
  * @author centre
  * 调用jad.exe进行反编译
  *
  */
    class DecodeMonitor implements ActionListener{

  @Override
  public void actionPerformed(ActionEvent e) {
   String pathTmp=tf.getText();
   //注意java中的/和/
   String path=pathTmp.replace("//", "/");
   int b=findClass(path);
   if (b==1) {
    ta.setText(ta.getText()+"/n"+"反编译完成!");
   }else {
    ta.setText(ta.getText()+"/n"+"编译过程中出现错误,请查看。");
   }
   
   
  }
  /**
   * @author centre
   * @param path String 传入目录和文件目录
   * @return int 没有任何错误返回1,否则返回0
   * 用递归方法找到所有的.class文件,然后将其反编译到该目录下
   */
  private int findClass(String path){
   int b=1;
   File baseFile=new File(path);
   Pattern p=Pattern.compile(".*class$");
   Matcher m=null;
   String tmp=null;
   //String[] fileList=baseFile.list();
   if (!baseFile.exists()) {
    new JDialog(jf, "该目录不存在!").setVisible(true);
   }
   
   if (baseFile.isDirectory()) {
    String[] fileList=baseFile.list();
    for (int i = 0; i < fileList.length; i++) {
     File readFile=new File(path+"/"+fileList[i]);
                    if (readFile.isDirectory()) {
      findClass(path+"/"+fileList[i]);
     }else {
      tmp=readFile.getName();
      m=p.matcher(tmp);
      String path1=readFile.getAbsolutePath().replace("//", "/");
      String path2=readFile.getParent().replace("//", "/");
      if (m.find()) {
       try {
        //java调用exe文件
        Runtime.getRuntime().exec("jad.exe -o -d "+path2+" -s java "+path1);
        ta.setText(ta.getText()+"/n"+path1+"反编译成功!");
        System.out.println(path2);
       } catch (IOException e) {
        b=0;
        e.printStackTrace();
       }
      }else {
       b=0;
       ta.setText(ta.getText()+"/n"+path1+"该文件不能反编译!");
      }
     }
    }
   }else {
    tmp=baseFile.getName();
    m=p.matcher(tmp);
    String path1=baseFile.getAbsolutePath().replace("//", "/");
    String path2=baseFile.getParent().replace("//", "/");
    if (m.find()) {
     try {
      Runtime.getRuntime().exec("jad.exe -o -d "+path2+" -s java "+path1);
      ta.setText(ta.getText()+"/n"+path1+"反编译成功!");
      System.out.println(path2);
     } catch (IOException e) {
      b=0;
      e.printStackTrace();
     }
    }else {
     b=0;
     ta.setText(ta.getText()+"/n"+path1+"该文件不能反编译!");
    }
   
   }
   return b;
  }
     
    }
}

反编译工具jad.exe 和 对应的eclipse插件jadclipse:(网络资源,服务大众) 已测试环境:windows 2000/NT/xp/vista; 推荐eclipse插件安装方法:.lnk文件安装; ----------使用方法------------ JadClipse Eclipse Plugin for Eclipse version 3.3 一、下载: 下载插件: 下载jadclipse_3.3.0.jar版本,该版本支持eclipse3.3M6以上版本 下载Jad反编译工具: http://www.kpdus.com/jad.html#download,在该页中找到适合自己操作系统平台的jad下载。下载后解压,然后将解压后的jad.exe文件复制到%JAVA_HOME%\bin目录下面(可以将jad.exe放到任意位置,只要记住其存放路径就好,下面要用到)。 二、安装: Eclipse中的插件安装可以参考:Eclipse使用技巧()Eclipse中插件的安装 方法1、直接将jadclipse_x.x.x.jar(x.x.x.代表版本号)复制到%ECLIPSE_HOME%\plugins目录下。 方法2、使用link方式安装,建立D:\Myplugins\jadclipse3.2.4\eclipse\plugins的目录结构,将jadclipse_3.2.4.jar放到plugins目录下面(注:其中D:\Myplugins为你自己定义的一个专门放置插件的目录)。再在%ECLIPSE_HOME%\links目录下面建立一个jadclipse3.2.4.link文件(该文件名随便取)。文件里面内容为:path=D:/Myplugins/jadclipse3.2.4. 三、使用: 启动eclipse,点击反编译的类文件,此时会激活jadclipse插件,在eclipse菜单中会多出一个jadclipse菜单,如下图所示: 一般地它会自动反编译相应的class文件,如果没有自动反编译,请点击 jadclipse->Decompile 常见问题及解决: (一)启动eclipse,打开Window->Preferences->Java->JadClipse,如果没有找到JadClipse,即JadClipse插件没有激活。 (1)检查插件安装的版本是否与你安装的eclipse版本对应 (2)使用 –clean参数来启动eclipse (二)在使用JadClipse插件反编译class文件时出现如下类似错误: /*jadclipse*/ /* DECOMPILATION REPORT Decompiled from: D:\Program Files\Java\jdk1.5.0_12\jre\lib\rt.jar Total time: 16 ms Jad reported messages/errors: Exit status: 0 Caught exceptions: java.io.IOException: CreateProcess: (...) */ 请确保你的Jad路径在eclipse中正确制定。 启动eclipse,打开:Window->Preferences->Java->JadClipse. 1Path to decompiler,这里设置反编译工具jad的全路径名,比如:%JAVA_HOME%\bin\jad.exe. 2、Directory for temporary files,这里设置临时文件路径。 至于Window->Preferences->Java->JadClipse目录下的Debug,Directives,Formatting,Misc目录中的参数设置,就不再罗嗦了。 (三)安装完成后,eclipse没有自动将JadClipse Class File Viewer设置成class文件的缺省打开方式。 如果没有默认,可以在Eclipse的Windows—> Perference—>General->Editors->File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer”。设置完成后,双击*.class文件,eclipse将自动反编译
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值