0

I've never used Javap before. Could someone explain what "Code" means in this example? It shows up threes time. What does it mean in the context of the mnemonics that follow on the lines below it? Does it indicate that there is another Stack frame or something?:

Compiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
  java.lang.String date;

  java.lang.String email;

  public DocFooter();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/applet/Applet."<init>":()V
       4: return        

  public void init();
    Code:
       0: aload_0       
       1: sipush        500
       4: bipush        100
       6: invokevirtual #2                  // Method resize:(II)V
       9: aload_0       
      10: aload_0       
      11: ldc           #3                  // String LAST_UPDATED
      13: invokevirtual #4                  // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
      16: putfield      #5                  // Field date:Ljava/lang/String;
      19: aload_0       
      20: aload_0       
      21: ldc           #6                  // String EMAIL
      23: invokevirtual #4                  // Method getParameter:(Ljava/lang/String;)Ljava/lang/String;
      26: putfield      #7                  // Field email:Ljava/lang/String;
      29: return        

  public void paint(java.awt.Graphics);
    Code:
       0: aload_1       
       1: new           #8                  // class java/lang/StringBuilder
       4: dup           
       5: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
       8: aload_0       
       9: getfield      #5                  // Field date:Ljava/lang/String;
      12: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      15: ldc           #11                 // String  by 
      17: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      20: invokevirtual #12                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      23: bipush        100
      25: bipush        15
      27: invokevirtual #13                 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
      30: aload_1       
      31: aload_0       
      32: getfield      #7                  // Field email:Ljava/lang/String;
      35: sipush        290
      38: bipush        15
      40: invokevirtual #13                 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V
      43: return        
}

I looked through the Spec for the JVM and didn't find anything explaining "Code:", but if it turns out that I overlooked it pleased post the link to that section. Thanks.

coderrick
  • 1,011
  • 1
  • 8
  • 25
  • http://docs.oracle.com/javase/specs/jvms/se7/html/ – Hot Licks Aug 07 '15 at 17:41
  • 1
    I voted to close because this is too broad. It is unreasonable for someone to explain an entire language spec here. – bhspencer Aug 07 '15 at 17:43
  • https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings – Jeffrey Aug 07 '15 at 17:46
  • I did use google however I did not find answers to my questions. Hence me posting to stack overflow. I'm essentially asking 4 questions which are at the the very end of the post. None of the articles I have looked at have answered them. I'm not looking to know what the mnemonics mean I can look those up easily. – coderrick Aug 07 '15 at 17:49
  • Okay so this link answers 3 of 4 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.1. However, I don't see anything in the spec that goes into detail about the sections. Ex - `public void paint(java.awt.Graphics)` `Code:` – coderrick Aug 07 '15 at 17:57
  • That's a method!!! Really not much different from the method declaration in the Java source. – Hot Licks Aug 08 '15 at 01:53
  • I edited my post can all of you reconsider and reopen my post? – coderrick Aug 15 '15 at 17:36

2 Answers2

1

Javap is a tool designed to help Java programmers debug their code. It is not designed to be consumed by tools and there is no formal specification for the output. It can and does change from version to version.

That being said, if you understand the JVM specification and classfile format, it's fairly easy to understand the output of Javap.

Also note that Javap tries to make things more Java-like, which hides or obscures some of the details of the bytecode. For example, it outputs Java style method signatures, which doesn't necessary reflect what is in the bytecode (and it hides synthetic parameters).

If you want to see something that is closer to what the bytecode is, but still human readable, I'd recommend the Krakatau disassembler (disclosure, I wrote it). There are also a lot of other tools for viewing bytecode out there, and they're almost all better than Javap (it's not hard to be better than Javap).

Furthermore, what are the line numbers (0:),

The line number is just the offset of that instruction in the bytecode. It starts at 0, and most instructions are either 1 or 3 bytes. See the JVM spec for details.

what do the different sections mean (Public void init() followed by Code: on the next line), and what do the #[number] and comments mean?

That shows each method in the class, with the Javap-mangled Java style method signature. Then it is followed by a textual representation of each instruction in that method's bytecode. Again, see the JVM spec for details.

Antimony
  • 37,781
  • 10
  • 100
  • 107
1

The Java Virtual Machine Spec page is a labyrinth of links so, allow me to point out where exactly the info on disassembled bytecode can be found. Mostly everything about disassembled bytecode can be found under 3. Compiling for the Java Virtual Machine. Moreover, the immediate answer to my question can be found here Format of Examples.

Additonally, Antimony's answer gives more insight into other alternatives for viewing bytecode.

coderrick
  • 1,011
  • 1
  • 8
  • 25