如何仅在控制台中使用Eclipse读取Java字节代码?

时间:2013-08-01 18:56:18

标签: java eclipse console bytecode

eclipse编译的结果类文件与传统的“javac”命令不同。所以我想在eclipse中编译Java源代码以获得它的特殊输出。此外,此输出只能由eclipse本身打开(至少我不知道打开它的其他方法)。但是,打开这么多文件并将内容复制到记事本是一项艰巨的工作。

那么有没有其他方法可以自动读取eclipse生成的类文件?我想在控制台中有一些命令可以使用eclipse并自动输出结果吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用与javac相同的方式从命令行自己调用Eclipse编译器:您需要ECJ jar。例如,您可以使用以下命令编译类

java -jar ecj-4.2.2.jar hello.java

如果需要,这可以很容易地自动化,有一些关于使用ECJ的提示,特别是在this page上以编程方式和蚂蚁编译进行编译。

您可以使用eclipse包中的编译器,或直接将其与Eclipse下载分开。在撰写本文时,当前的最新版本是4.3,并且可以在Eclipse 4.3.0 download page上找到ECJ编译器。查找JDT Core Batch Compiler包。

从另一个答案的评论中,似乎你需要显示已编译的字节码,你可以在编译后调用javap

javap -c -p -s -v hello

编辑:显示已编译的课程

我想知道是否/如何以Eclipse可以显示的方式获取类转储。没有办法像调用eclipse编译器一样容易,但我总是通过将Eclipse内部类与最小类包装器一起重用来找到一个意思。

<强> ClassDump.java

import java.io.RandomAccessFile;
import java.io.FileInputStream;
import java.io.DataInputStream;

import org.eclipse.jdt.internal.core.util.Disassembler;
import org.eclipse.jdt.core.util.ClassFormatException;

/**
 * ClassDump : show a classfile dump the same way as Eclipse
 */
class ClassDump {

    public static void main(String[] args){

        System.out.println("Class dumper");
        if(args.length != 1){
            System.out.println("Usage : Disasm <file.class>");
            System.exit(1);
        }

        new ClassDump(args[0]);
    }

    public ClassDump(String classfile){

        byte[] classbuf = readClassBytes(classfile);

        System.out.println(String.format("Class size = %d bytes", classbuf.length));

        Disassembler dis = new Disassembler();
        try {
            System.out.print(dis.disassemble(classbuf, "\n", org.eclipse.jdt.internal.core.util.Disassembler.DETAILED));
        } catch(ClassFormatException cfe){
            cfe.printStackTrace();
        }
    }

    private byte[] readClassBytes(String classfile){
        byte[] buf;

        try{
            RandomAccessFile raf = new RandomAccessFile(classfile,"r");
            FileInputStream fis = new FileInputStream(raf.getFD());
            DataInputStream dis = new DataInputStream(fis);

            buf =  new byte[(int)raf.length()];
            dis.readFully(buf);

            dis.close();
            fis.close();
            raf.close();

        } catch (Exception ex){
            ex.printStackTrace();
            return new byte[0];
        }           

        return buf;

    }
}

在我的本地主机上,我编译(你可能需要更改jar名称):

javac -cp \dev\tools\eclipse\plugins\org.eclipse.jdt.core_3.8.3.v20130121-145325.jar ClassDump.java

该运行与Eclipse运行时jar(JDT核心,osgi,equinox,...)有很多依赖关系,所以我通过使用通配符让java获取所有需要的jar来作弊:

java -cp .;\dev\tools\eclipse\plugins\* ClassDump SomeClass.class

它将打印与Eclipse clas文件编辑器相同的输出... HTH!

答案 1 :(得分:0)

在项目目录中,导航到/ bin,在那里你很可能拥有Eclipse自动生成的.class文件。

要查看已编译类文件的java代码,您必须使用java decompiler, such as this one

.class - 文件本身是编译的二进制Java代码,如果在构建路径中链接了该类的任何源,则Eclipse会自动查看该类的源。