@@ -25,7 +25,80 @@ To be documented.
25
25
26
26
\subsection java-class-section How a java program / class is represented in a .class
27
27
28
- To be documented.
28
+ Every Java class is compiled into a .class file, inner classes, anonymous
29
+ classes or classes for tableswitches are compiled into their own .class
30
+ files.
31
+
32
+ There exists an [ official
33
+ specification] ( https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html )
34
+
35
+ Each class files contains information about its version, the constant pool,
36
+ information about the contained class, its super-class, its implemented
37
+ interfaces, its fields, methods and finally additional attributes.
38
+
39
+ The content of a .class file can be inspected via the ` javap ` tool which is part
40
+ of the JDK installation.
41
+
42
+ In general, all variable length entries in a class file are represented by first
43
+ having an integer ` n ` that specified the number of entries and then an array of
44
+ ` n ` such entries in the file.
45
+
46
+ The integer format used in class files are unsigned integers of size 8/16/32
47
+ bit, which are named as ` u1 ` /` u2 ` /` u4 ` .
48
+
49
+ \subsection Access flags
50
+
51
+ The JVM specification defines different access flags, e.g., ` final ` , ` static ` ,
52
+ ` protected ` , ` private ` etc. where different ones are applicable to the class
53
+ itself, its fields or methods. All access flags are represented as bits, the set
54
+ of bits that are defined for one entity is represented as disjunction of those
55
+ values. Each of these values is defined as a constant with a name prefixed with
56
+ ` ACC_ ` .
57
+
58
+ \subsection Constant Pool
59
+
60
+ The constant pool contains all strings and referred values that are used in the
61
+ .class. This includes the names of the class itself and its super-class, as well
62
+ as the names and signatures of all fields and methods. All strings in the
63
+ constant pool are in UTF-16 format.
64
+
65
+ \subsection Fields
66
+
67
+ Each member variable of a class has a field entry with a corresponding field
68
+ information structure. This contains the name of the field, its raw JVM type
69
+ (called the descriptor) and an optional signature.
70
+
71
+ A signature is an extension to the Java raw types and contains information about
72
+ the generic type of an object if applicable.
73
+
74
+ The name of the field, the descriptor and the signature are all represented as
75
+ indices into the constant pool of the class file.
76
+
77
+ \subsection Methods
78
+
79
+ Methods are represented in a similar way as fields. Each method has an
80
+ associated name, descriptor and optional signature entry in the constant pool
81
+ table.
82
+
83
+ An implemented method also has several attributes. One is the ` Code ` attribute
84
+ that stores the actual bytecode instructions. There is also an optional
85
+ ` LocalVariableTable ` which contains the names of local variables and
86
+ parameters. In addition to this there is also an optional
87
+ ` LocalVariableTypeTable ` that contains information about generic local variables
88
+ and parameters. Finally the exception table is defined as entries in the
89
+ ` Exceptions ` attribute.
90
+
91
+ Note: most information about generic types is optional and exists mainly as
92
+ debugger information. This is because the Java compiler ensures that typing is
93
+ correct and creates code accordingly.
94
+
95
+ \subsection Attributes
96
+
97
+ The last section contains additional attributes, e.g., ` SourceFile ` which
98
+ specified from which source file the .class was compiled, ` BootstrapMethods `
99
+ which is used for lambda functions or ` InnerClasses ` which refers to inner
100
+ classes of the class in question.
101
+
29
102
30
103
\section java-bytecode-runtime-exceptions Adding runtime exceptions (java_bytecode_instrument)
31
104
0 commit comments