Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java字节码_Java_Bytecode - Fatal编程技术网

理解Java字节码

理解Java字节码,java,bytecode,Java,Bytecode,我经常被一个没有源代码的java类文件所困扰,我试图理解我手头的问题 请注意,反编译器在所有情况下都很有用,但还不够 我有两个问题 有哪些工具可用于查看java字节码(最好从linux命令行获得) 熟悉java字节码语法的好参考资料是什么 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定的类文件创建java源文件 这是一个相关的问题,有助于了解如何反编译Java类文件 也就是说,可以使用JDK中的javap命令来分解Javac

我经常被一个没有源代码的java类文件所困扰,我试图理解我手头的问题

请注意,反编译器在所有情况下都很有用,但还不够

我有两个问题

  • 有哪些工具可用于查看java字节码(最好从linux命令行获得)
  • 熟悉java字节码语法的好参考资料是什么

  • 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定的
    文件创建
    java
    源文件

    这是一个相关的问题,有助于了解如何反编译Java
    文件

    也就是说,可以使用JDK中的
    javap
    命令来分解Java
    class
    文件。
    javap
    的输出将是
    文件中包含的Java字节码。但是请注意,字节码与Java源代码完全不同


    了解Java字节码和Java虚拟机本身的确切来源是。特别是,它有一个所有字节码指令的索引。

    如果您有一个类,但没有源代码,但有一个bug,则可以执行以下两个基本操作之一:

  • 反编译、修复错误并重新创建jar文件。我以前做过这件事,但是系统管理员对将其投入生产持谨慎态度
  • 为类编写单元测试,确定导致错误的原因,用单元测试报告错误并等待修复

    (2) 根据我的经验,通常是系统管理员更喜欢的

    如果使用(2),那么同时,由于您知道错误的原因,您可以不允许该输入进入类,以防止出现问题,或者准备在错误发生时正确处理它

    您还可以使用AspectJ将代码注入到问题类中,并在不重新编译的情况下更改方法的行为。我认为这可能是一个更好的选择,因为您可以为所有可能调用函数的代码更改它,而不必担心教每个人这个问题

    如果您学习阅读字节码指令,您将如何解决该问题

  • 我有两个问题

    1) 有哪些工具可用于查看java字节码(最好是可用的) (从linux命令行)

    javap
    工具(带有-c选项)将反汇编字节码文件。它从命令行运行,并作为JavaSDK的一部分提供

    2) 熟悉java字节码语法的好参考资料是什么

    javap
    工具使用的语法与JVM规范中使用的语法相同,JVM规范自然是最终的源代码。我还发现了BillVenners的“Java虚拟机内部”。我从来没有读过,而且看起来可能已经绝版了


    实际的(文本)语法很简单,而且是不言自明的。。。假设您有一个解释字节码功能的参考,并且您对阅读此级别的代码相当熟悉。但是,读取反编译器的输出可能会更容易,即使字节码已经通过模糊器输入。

    要查看类文件的字节码指令,请使用
    javap-v
    命令,就像运行java程序一样,指定类路径(如果需要)和类名

    例如:

    javap -v com.company.package.MainClass
    
    关于字节码指令集,
    是一个分析反编译器,因此它将类反编译为可读的java代码,而不是字节码。当您想了解代码的工作原理时,它会更有用。

    您可能会发现Eclipse字节码大纲插件非常有用:


    我自己也没有用过它,只是顺便提到过而已。

    1。我不知道可以使用AspectJ在.class中插入代码,我以为它在java上可以工作,但我想我错了。当我发现问题时,我该怎么办?很多时候,在解决问题的过程中,你会发现问题的实质是什么problem@hhafez-您可以在运行时将方面编织到类中,但是,这样做时可能会违反许可证,所以请小心一点。单元测试可能是你最好的选择,但如果代码不可测试,那么反编译将成为一种选择,但这是一个缓慢的过程,依我看,我对反编译器的评论,@hhafez:我想你的问题“理解Java字节码”得到了回答,不是吗?这个答案完全涵盖了原始问题的两个方面。