Bytecode
plattform- / betriebssystemunabhängig Bytecode
Bytecode
möglichjava.lang
Object, Class, String, System, Thread
java.lang.reflect
java.lang.ref
Byte, Short, Integer, Long, Float, Double, Character
java.util
java.io
Bytecode
int, long, float, double
boolean, byte, short, char
(werden als int
verarbeitet)returnAddress
für Unterprogrammereference
für Klassen, Interfaces, Aufzählungen, ArraysClassLoader
ClassNotFoundException
ClassLoader
null
setzen!.class
-Dateiformat
ClassFile
-TabelleName | Wert | Beschreibung |
---|---|---|
ACC_PUBLIC | 0x0001 | Klasse ist als public deklariert, daher Zugriff auch von außerhalb ihres Pakets erlaubt. |
ACC_FINAL | 0x0010 | Klasse ist als final deklariert, keine Unterklassen erlaubt. |
ACC_SUPER | 0x0020 | Besondere Behandlung für Methoden der Superklasse beim Aufruf über invokespecial . |
ACC_INTERFACE | 0x0200 | class -File beschreibt ein Interface, keine Klasse. ACC_ABSTRACT erforderlich. |
ACC_ABSTRACT | 0x0400 | Klasse ist als abstract deklariert, daher keine Instanziierung erlaubt. |
ACC_SYNTHETIC | 0x1000 | Klasse ist vom Compiler generiert, im Quellcode nicht vorhanden. |
ACC_ANNOTATION | 0x2000 | class -File beschreibt eine Annotation, keine Klasse. ACC_INTERFACE erforderlich. |
ACC_ENUM | 0x4000 | Diese Klasse (oder ihre Superklasse) ist als Aufzählungstyp enum definiert. |
.class
-Dateiformat
ConstantPool
-Tabellejava/lang/String
[I
exampleMethode
FINAL_STATIC_FIELD
<init>, <clinit>
.class
-Dateiformat
Field
und Method
-TabelleName | Wert | Beschreibung |
---|---|---|
ACC_PUBLIC | 0x0001 | Feld ist als public deklariert, daher Zugriff auch von außerhalb des Pakets erlaubt. |
ACC_PRIVATE | 0x0002 | Feld ist als private deklariert, daher Zugriff nur in der definierenden Klasse. |
ACC_PROTECTED | 0x0004 | Feld ist als protected deklariert, daher Zugriff auch in Unterklassen der definierenden Klasse. |
ACC_STATIC | 0x0008 | Feld ist als static deklariert, also eine Klassenvariable (ohne) oder Konstante (mit) ACC_FINAL . |
ACC_FINAL | 0x0010 | Feld ist als final deklariert, daher keine weitere Zuweisung nach Initalisierung möglich. |
ACC_VOLATILE | 0x0040 | Feld ist als volatile deklariert, daher kein cachen des Werts möglich. |
ACC_TRANSIENT | 0x0080 | Feld ist als transient deklariert, daher kein lesender oder schreibender Zugriff vom PersistentObjectManager . |
ACC_SYNTHETIC | 0x1000 | Feld ist vom Compiler generiert, im Quellcode nicht vorhanden. |
ACC_ENUM | 0x4000 | Feld wird verwendet, um einen Wert eines Aufzählungstyp zu speichern. |
Name | Wert | Beschreibung |
---|---|---|
ACC_PUBLIC | 0x0001 | Methode ist als public deklariert, daher Aufruf auch von außerhalb des Pakets erlaubt. |
ACC_PRIVATE | 0x0002 | Methode ist als private deklariert, daher Aufruf nur in der definierenden Klasse möglich. |
ACC_PROTECTED | 0x0004 | Methode ist als protected deklariert, daher Aufruf auch in Unterklassen der definierenden Klasse erlaubt. |
ACC_STATIC | 0x0008 | Methode ist als static deklariert, also eine Klassenmethode. |
ACC_FINAL | 0x0010 | Methode ist als final deklariert, kann nicht überschrieben werden. |
ACC_SYNCHRONIZED | 0x0020 | Methode ist als synchronized deklariert, daher Aufruf über einen Monitor. |
ACC_BRIDGE | 0x0040 | Methode wurde als Bridge-Methode (Type Erasure) vom Compiler erzeugt. |
ACC_VARARGS | 0x0080 | Methode wurde im Quellcode mit variabler Parameteranzahl deklariert. |
ACC_NATIVE | 0x0100 | Methode ist als native deklariert, wird daher in einer anderen Sprache als Java-Bytecode implementiert. |
ACC_ABSTRACT | 0x0400 | Methode ist als abstract deklariert, besitzt daher keine Implementierung. |
ACC_STRICT | 0x0800 | Methode ist als strictfp deklariert, verwendet daher den Gleitkomma-Modus FP-strict. |
ACC_SYNTHETIC | 0x1000 | Methode ist vom Compiler generiert, im Quellcode nicht vorhanden. |
descriptor
in Method
- und Field
-TabelleSignature
in ClassFile
-, Method
- und Field
-TabelleBaseType -Zeichen | Typ | Bedeutung |
---|---|---|
B | byte | vorzeichenbehafteter Bytewert |
C | char | Unicode-Zeichen |
D | double | Fließkommawert mit doppelter Genaigkeit |
F | float | Fließkommawert mit einfacher Genauigkeit |
I | int | vorzeichenbehafteter Integerwert |
J | long | vorzeichenbehafteter Longwert |
LClassname; | reference | Eine Instanz der Klasse Classname |
S | short | vorzeichenbehafteter Shortwert |
V | void | entspricht dem Rückgabewert void
|
Z | boolean | true oder false |
[ | reference | Eine Array-Dimension |
Bytecode
.class
-Dateien.java
)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RuntimeComplexity {
enum Complexity { On, On2, O1 };
Complexity complexity();
String hint() default "";
}
.class
-Dateiformat
Code
-AttributException-Tabelle
.class
-Dateiformat
attributierter Feld-Typ | constant_value_index →RCP-Eintrag |
---|---|
long | CONSTANT_Long →5 |
float | CONSTANT_Float →4 |
double | CONSTANT_Double →6 |
int,short,char,byte,boolean | CONSTANT_Integer →3 |
String | CONSTANT_String →8 |
Bytecode
s (1)pop, dup, swap
wide
long, float, double
gegen 0instanceof
)int
auf <, <=, =, >, >=
sowie switchesreference
auf = null, != null, =
Bytecode
s (2)Bytecode
s (3)Arithmetik "ALU" |
Ganzzahlen |
iadd,
isub,
imul,
idiv,
irem,
ineg,
ladd, lsub, lmul, ldiv, lrem, lneg |
---|---|---|
Gleitkomma |
fadd,
fsub,
fmul,
fdiv,
frem,
fneg,
dadd, dsub, dmul, ddiv, drem, dneg |
|
Bitweise |
ishl,
ishr,
iushr,
iand,
ior,
ixor,
lshl, lshr, lushr, land, lor, lxor |
|
Typumwandlung |
i2l,
i2f,
i2d,
i2b,
i2c,
i2s,
l2i, l2f, l2d, f2i, f2l, f2d, d2i, d2l, d2f |
|
Flusskontrolle | Sprünge |
lcmp,
fcmpl,
fcmpg,
dcmpl,
dcmpg,
ifeq, ifne, iflt, ifge, ifgt, ifle, if_icmpeq, if_icmpne, if_icmplt, if_icmpge, if_icmpgt, if_icmple, if_acmpeq, if_acmpne, ifnull, ifnonnull, goto, goto_w |
Unterprogramme | jsr, ret, jsr_w | |
Tabellen | tableswitch, lookupswitch | |
Methoden |
invokevirtual,
invokespecial,
invokestatic,
invokeinterface,
ireturn, lreturn, freturn, dreturn, areturn, return |
|
Exceptions | athrow | |
Threads | monitorenter, monitorexit |
new
...
new myClass(int i, Object o);
...
...
new #1 // uninitialisierten Speicher für myClass allozieren
dup // Objekt-Referenz auf Stack verdoppeln
iload_1 // i auf Stack bringen
aload_2 // o auf Stack bringen
invokespecial #7 // myClass.<init> aufrufen
...
...
this.value = this.otherValue;
...
...
aload_0 // Referenz this auf Stack
dup // x 2
getfield #13 // Wert von otherValue auf Stack
putfield #6 // Wert vom Stack in value
...
...
int x = 10000 + 1;
x += (int)200.5d;
...
...
aload_0 // Referenz this auf Stack
ldc #5 // 10000 aus CP laden und auf Stack
iconst_1 // 1 auf Stack
iadd // 10000 + 1
putfield #7 // Wert vom Stack in x
aload_0 // wieder this auf Stack
ldc2_w #140 // 200.5 aus CP laden und auf Stack
d2i
putfield #7 // wieder Wert vom Stack in x
...
Example
)
...
mulBy5(2);
...
int mulBy5(int v) { return Example.mul(v,5); }
static int mul(int l, inr r) { return l * r; }
...
aload_0 // this auf Stack
iconst_2 // 2 auf Stack
invokevirtual #3 // Methode this.mulBy5(I)I aufrufen
...
iload_1 // v aus LV 1 auf Stack
iconst_5 // 5 auf Stack
invokestatic #9 // Methode Example.mul(II)I aufrufen
ireturn // Ergebnis zurückgeben
iload_0 // l aus LV 0 auf Stack
iload_1 // r aus LV 1 auf Stack
imul
ireturn // Ergebnis zurückgeben
class Near {
Near(float value) { this.value = value; }
float value;
private float getValue() { return value }
public float getValueNear() { return getValue() }
}
class Far {
float getValueFar() { return super.getValueNear(); }
Near getNear(float v) { return new Near(v); }
}
// Implementierung von getValueNear()F
aload_0
invokespecial #6 // Near.getValue()F aufrufen
freturn
// Implementierung von getValueFar()F
aload_0
invokespecial #5 // Near.getValueNear()F aufrufen
freturn
// Implementierung von Far.getNear(F)V
new #1 // neue Instanz von Near allozieren
dup
fload_1 // v auf Stack
invokespecial #4 // Methode Near.<init>(F)V
areturn // neue Instanz zurückgeben
class MyList<E extends Comparable<E>> {
E first;
boolean isFirstElement(E e) {
return this.first.compareTo(e) == 0;
}
...
}
isFirstElement
)
0: aload_0
1: getfield #23; // Field first:Ljava/lang/Comparable;
4: aload_1
5: invokeinterface #25, 2; // InterfaceMethod java/lang/Comparable.
// compareTo:(Ljava/lang/Object;)I
10: ifne 15 // bei != 0 zu Offest 15
13: iconst_1
14: ireturn
15: iconst_0
16: ireturn
MCP
kann aufgelöst werden.invokespecial
MCP
ist eine Initialisierungsmethode <init>(...)
.MCP
ist private
.C
= direkte Superklasse der aktuellen Klasse (Frame).invokevirtual, invokeinterface
C
= Klasse der Objekt-InstanzC
Instanz-Methode M ≡ MCP
, wird M
aufgerufen, sonst 2.
invokevirtual
: M
muss für C
zugreifbar sein)C
eine Superklasse S
, wird das Lookup rekursive für S
ausgeführt, sonst AbstractMethodError
.void nestedCatch() {
try {
try {
tryThis();
} catch (Exc1 e) {
handle1();
}
} catch (Exc2 e) {
handle2();
}
}
void nestedCatch();
Code:
0: aload_0
1: invokevirtual #15; //Method tryThis:()V
4: goto 20
7: astore_1
8: aload_0
9: invokevirtual #18; //Method handle1:()V
12: goto 20
15: astore_1
16: aload_0
17: invokevirtual #21; //Method handle2:()V
20: return
Exception table:
from to target type
0 4 7 Class Exc1
0 12 15 Class Exc2
jsr, jsr_w
ret
jsr(_w)
:
returnAddress
auf OS gebrachtjsr(_w)
-Befehls (Unterprogramm)returnAddress
in LV i
ret
:
returnAddress
aus LV i
in PC
des ThreadsPC
Bytecode
-VerifierBytecode
scode
-Arrays einer Methodeldc
→ int, float, String
ldc2
→ long, double
getfield, getstatic
→ Fieldref/Field
code
-Array endet nicht mitten in einer Instruktion.return?
vorhandenstart_pc, end_pc
liegen innerhalb des code
-Arraysstart_pc < end_pc
handler_index
verweist auf Exception-Klasse