0

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

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

谢谢。

4

2 回答 2

2

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

java -jar ecj-4.2.2.jar hello.java

如果您需要,这可以很容易地自动化,这里有一些关于使用 ECJ 的技巧,尤其是关于以编程方式编译和 ant 编译的技巧

您可以使用 Eclipse 包中的编译器,或者直接从 Eclipse 下载中分离出来。在撰写本文时,当前最新版本是 4.3,ECJ 编译器可以在Eclipse 4.3.0 下载页面上找到。寻找JDT Core Batch Compiler包裹。

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

javap -c -p -s -v hello

编辑:显示编译类

我想知道是否/如何以 Eclipse 可以显示的相同方式获取类转储。没有办法像调用 eclipse 编译器那样简单,但无论如何我通过重用 Eclipse 内部类和最小的类包装器找到了一种方法。

类转储.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 类文件编辑器相同的输出...... HTH!

于 2013-08-02T08:24:45.170 回答
0

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

要查看已编译类文件的 java 代码,您必须使用java 反编译器,例如这个.

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

于 2013-08-01T19:07:16.020 回答