当前位置: 首页 > 知识库问答 >
问题:

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

白子默
2023-03-14

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

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

谢谢

共有2个答案

彭宏深
2023-03-14

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

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

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

孟鸿德
2023-03-14

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

java -jar ecj-4.2.2.jar hello.java

如果需要,这可以很容易地实现自动化。本页提供了一些有关使用ECJ的技巧,特别是关于编程编译和ant编译的技巧。

您可以使用eclipse包中的编译器,或者直接从Eclipse下载中分离出来。在撰写本文时,当前最新版本是4.3,ECJ编译器可以在Eclipse 4.3.0下载页面上找到。查找JDT核心批处理编译包。

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

javap -c -p -s -v hello

编辑:显示已编译的类

我想知道是否/如何以与Eclipse相同的方式获得类转储。没有比调用eclipse编译器更容易的方法了,但是我已经找到了一个方法,通过重用Eclipse内部类和最小的类包装器。

D类ump.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文件编辑器相同的输出。。。嗯!

 类似资料:
  • 我用PDFBox读取PDF文件。但有些字符的打印效果不好,打印效果与控制字符类似。有人帮助从控制字符中读取值。我附上了图片,请看一下图片样本PDF: 截图:

  • 我想从Java程序接收Arduino Uno上的多个字节。arduino在收到数据后立即处理数据,因此我不需要存储它,我使用串行RX缓冲区作为临时存储,直到我实际读取字节为止。完全实现后,每次将发送大约150个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库 我在下面放了一些arduino和java代码。当我从IDE的串行监视器发送字节,按预期点亮le

  • 如何在java中读取整数输入...我尝试了缓冲阅读器和扫描仪...但它不输出任何东西...我正在使用eclipse Indigo...它会影响输出吗... 示例代码:

  • 问题内容: 如何使用该类从控制台读取输入?像这样: 基本上,我只需要让扫描程序读取用户名的输入,然后将输入分配给变量。 问题答案: 一个简单的例子来说明如何从中读取单个整数。这真的很简单。 要检索用户名,我可能会使用。 如果你想对输入进行更多控制,或者仅验证变量,也可以使用。 你可以在API文档中找到有关其实现的更多信息

  • 如何使用类从控制台读取输入?类似这样的事情: 基本上,我想要的只是让扫描器读取用户名的输入,并将输入赋给变量。

  • 问题内容: 当用户在Java中键入单个字符时,是否有一种简单的方法可从控制台读取它?可能吗?我尝试了这些方法,但是它们都在等待用户按Enter键: 我开始认为System.in在按下Enter之前不知道用户输入。 问题答案: 您要做的是将控制台置于“原始”模式(绕过行编辑且无需输入键),而不是“经烹煮”模式(需要输入键进行行编辑)。在UNIX系统上,“ stty”命令可以更改模式。 现在,关于Ja