Skip to content

Commit

Permalink
Update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
T5750 committed Feb 3, 2020
1 parent 2c011ed commit 11c5805
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 1 deletion.
1 change: 1 addition & 0 deletions doc/source/jdk8/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ Java™ Platform Standard Ed. 8

jdkJre
Lambda
javap
javassistTutorial
104 changes: 104 additions & 0 deletions doc/source/jdk8/javap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# javap

Disassembles one or more class files.

## Synopsis
```
javap [options] classfile...
```
- `classfile`: One or more classes separated by spaces to be processed for annotations such as `DocFooter.class`. You can specify a class that can be found in the class path, by its file name or with a URL such as `file:///home/user/myproject/src/DocFooter.class`.

## Description
The `javap` command disassembles one or more class files. The output depends on the options used. When no options are used, then the `javap` command prints the package, protected and public fields, and methods of the classes passed to it. The `javap` command prints its output to `stdout`.

## Options
- `-help`, `--help`, `-?`: Prints a help message for the `javap` command.
- `-version`: Prints release information.
- `-l`: Prints line and local variable tables.
- `-public`: Shows only public classes and members.
- `-protected`: Shows only protected and public classes and members.
- `-private`, `-p`: Shows all classes and members.
- `-Joption`: Passes the specified option to the JVM. For example:
* `javap -J-version`
* `javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName`
- `-s`: Prints internal type signatures.
- `-sysinfo`: Shows system information (path, size, date, MD5 hash) of the class being processed.
- `-constants`: Shows `static final` constants.
- `-c`: Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class.
- `-verbose`: Prints stack size, number of locals and arguments for methods.
- `-classpath path`: Specifies the path the `javap` command uses to look up classes. Overrides the default or the `CLASSPATH` environment variable when it is set.
- `-bootclasspath path`: Specifies the path from which to load bootstrap classes. By default, the bootstrap classes are the classes that implement the core Java platform located in `jre/lib/rt.jar` and several other JAR files.
- `-extdir dirs`: Overrides the location at which installed extensions are searched for. The default location for extensions is the value of `java.ext.dirs`.

## Example
The output from the `javap DocFooter.class` command yields the following:
```
Compiled from "DocFooter.java"
public class t5750.javap.DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public t5750.javap.DocFooter();
public void init();
public void paint(java.awt.Graphics);
}
```

The output from `javap -c DocFooter.class` command yields the following:
```
Compiled from "DocFooter.java"
public class t5750.javap.DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public t5750.javap.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
}
```

## References
- [javap](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javap.html)
39 changes: 38 additions & 1 deletion doc/source/jdk8/javassistTutorial.md
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,43 @@ All modified class files are saved in `./dump`.
- `IntrospectionAndCustomizationTest`
- `BytecodeLevelApiTest`

### What Is the Bytecode?
```
cd java-repositories/jdk8/t5750/javassist/domain
javap -c Pair.class
```
```
public class t5750.javassist.domain.Pair extends java.awt.geom.Point2D implements java.io.Serializable {
public t5750.javassist.domain.Pair(int, int);
Code:
0: aload_0
1: invokespecial #80 // Method java/awt/geom/Point2D."<init>":()V
4: aload_0
5: iload_1
6: putfield #75 // Field x:I
9: aload_0
10: iload_2
11: putfield #76 // Field y:I
14: return
public void move(int, int);
Code:
0: aload_0
1: iload_1
2: putfield #75 // Field x:I
5: aload_0
6: iload_2
7: putfield #76 // Field y:I
10: return
}
```
Let's analyze the bytecode instructions of the `move()` method:
- `aload_0` instruction is loading a reference onto the stack from the local variable 0
- `iload_1` is loading an int value from the local variable 1
- `putfield` is setting a field `x` of our object. All operations are analogical for field `y`
- The last instruction is a `return`

## References
- [Getting Started with Javassist](http://www.javassist.org/tutorial/tutorial.html)
- [Dynamic Class Loading Example](https://examples.javacodegeeks.com/core-java/dynamic-class-loading-example/)
- [Dynamic Class Loading Example](https://examples.javacodegeeks.com/core-java/dynamic-class-loading-example/)
- [Introduction to Javassist](https://www.baeldung.com/javassist)
1 change: 1 addition & 0 deletions jdk8/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## Contents
- [Lambda](../doc/source/jdk8/Lambda.md)
- [JDK, JRE, JVM, JSE, JEE, JME](../doc/source/jdk8/jdkJre.md)
- [javap](../doc/source/jdk8/javap.md)

### Javassist
[Javassist Tutorial](../doc/source/jdk8/javassistTutorial.md)
Expand Down
20 changes: 20 additions & 0 deletions jdk8/src/test/java/t5750/javap/DocFooter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package t5750.javap;

import java.applet.Applet;
import java.awt.*;

public class DocFooter extends Applet {
String date;
String email;

public void init() {
resize(500, 100);
date = getParameter("LAST_UPDATED");
email = getParameter("EMAIL");
}

public void paint(Graphics g) {
g.drawString(date + " by ", 100, 15);
g.drawString(email, 290, 15);
}
}

0 comments on commit 11c5805

Please sign in to comment.