disassembler.java

来自「First of all, the Applet-phone is a SIP 」· Java 代码 · 共 96 行

JAVA
96
字号
package gov.nist.util.disassembler;import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;import org.apache.bcel.classfile.ClassParser;import org.apache.bcel.classfile.JavaClass;import org.apache.bcel.classfile.Method;import org.apache.bcel.generic.CodeExceptionGen;import org.apache.bcel.generic.ConstantPoolGen;import org.apache.bcel.generic.InstructionHandle;import org.apache.bcel.generic.InstructionList;import org.apache.bcel.generic.MethodGen;/* * Disassembler.java * * Created on June 19, 2003, 9:47 AM *//** * * @author  DERUELLE Jean */public class Disassembler {    String className=null;    ConstantPoolGen cp=null;    PrintStream ps=null;        public Disassembler(String className,String outputFile){        this.className=className;        try{            File file=new File(outputFile);            if(file.exists())                file.delete();            file.createNewFile();            FileOutputStream fos=new FileOutputStream(file);            ps=new PrintStream(fos);        }        catch(Exception e){            e.printStackTrace();        }    }        public void printByteCodeMethod(MethodGen method){        ps.println("/******************************/");        ps.println("Method "+method.getName());        ps.println("/******************************/");                InstructionList il = method.getInstructionList();        il.setPositions();        InstructionHandle[] instructionHandles=il.getInstructionHandles();        for(int i=0;i<instructionHandles.length;i++){            ps.print(instructionHandles[i].getPosition()+"  ");            ps.println(instructionHandles[i].getInstruction().toString(cp.getConstantPool()));        }        CodeExceptionGen[] exceptionTable=method.getExceptionHandlers();        if(exceptionTable.length!=0){            ps.println("/******************************/");            ps.println("Exception(s) ");            ps.println("/******************************/");                    ps.println("Try start \t Try end \t Catch Start ");            for(int i=0;i<exceptionTable.length;i++){                ps.println(exceptionTable[i].getStartPC().getPosition()+" \t\t "+exceptionTable[i].getEndPC().getPosition()+" \t\t "+exceptionTable[i].getHandlerPC().getPosition());                                       ps.println("Exception Type : "+exceptionTable[i].getCatchType().getClassName());            }        }        ps.println();    }        public void printAllByteCode(){        try{            JavaClass jclass = new ClassParser(className).parse();            cp  = new ConstantPoolGen(jclass.getConstantPool());            ps.println("Informations about the class "+className+" : ");            ps.println(jclass.toString());            ps.println();            Method methods[] = jclass.getMethods();              for (int i= 0; i < methods.length; i++) {                MethodGen mg = new MethodGen(methods[i],jclass.getClassName(), cp);                printByteCodeMethod(mg);                            }        }        catch(java.io.IOException ioe){            ioe.printStackTrace();        }    }        public static void main(String args[]){        Disassembler disassembler=new Disassembler(args[0],args[1]);        disassembler.printAllByteCode();                //Class2HTML.main(args);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?