Layouts und Structs
Native Speicherlayouts beschreiben
Layouts und Structs ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Nativen Speicher beschreiben
Native Daten bestehen nur selten aus einem einzelnen Wert. C verwendet Strukturen, Arrays und Unions. FFM bildet diese Formen mit Speicherlayouts ab, sodass Sie strukturierten nativen Speicher sicher lesen und schreiben können.
Die Layout-Familie
Die Layout-Typen bilden eine kleine Hierarchie:
ValueLayout: ein primitiver Wert (int, long, double, address)SequenceLayout: ein Array fester Größe aus einem LayoutStructLayout: sequenziell angeordnete FelderUnionLayout: sich überlappende Felder
Ein ValueLayout
Die einfachsten Layouts sind die integrierten ValueLayouts. Sie enthalten Angaben zu Größe, Ausrichtung und Byte-Reihenfolge.
import java.lang.foreign.ValueLayout;
public class Main {
public static void main(String[] args) {
System.out.println("int size: " + ValueLayout.JAVA_INT.byteSize());
System.out.println("double size: " + ValueLayout.JAVA_DOUBLE.byteSize());
}
}Eine Struktur definieren
Modellieren Sie eine C-Struktur mit MemoryLayout.structLayout(...), und benennen Sie jedes Feld mit withName. Betrachten Sie struct Point { int x; int y; } in C.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
System.out.println("Point size: " + point.byteSize());
}
}VarHandles für Felder
Um ein benanntes Feld zu lesen oder zu schreiben, leiten Sie mithilfe eines Pfadausdrucks ein VarHandle ab. groupElement("x") wählt das Feld anhand seines Namens aus.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xHandle = point.varHandle(
MemoryLayout.PathElement.groupElement("x"));
System.out.println("Built VarHandle for x: " + xHandle);
}
}Eine Struktur lesen und schreiben
Reservieren Sie ein Segment in der Größe des Layouts und verwenden Sie anschließend die VarHandles, um Felder zu setzen und auszulesen. Das entspricht dem Ausfüllen einer C-Struktur.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xh = point.varHandle(MemoryLayout.PathElement.groupElement("x"));
VarHandle yh = point.varHandle(MemoryLayout.PathElement.groupElement("y"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment p = arena.allocate(point);
xh.set(p, 0L, 3);
yh.set(p, 0L, 4);
System.out.println("Point = (" + xh.get(p, 0L) + ", " + yh.get(p, 0L) + ")");
}
}
}Padding und Ausrichtung
C-Compiler fügen Padding ein, damit Felder ausgerichtet sind. FFM fügt es nicht automatisch hinzu. Sie müssen daher MemoryLayout.paddingLayout(n) einfügen, damit das C-Layout exakt nachgebildet wird.
Eine falsche Ausrichtung beschädigt jedes Feld nach der Lücke.
Beispiel für explizites Padding
Bei struct { char c; int n; } muss das int an einer 4-Byte-Grenze ausgerichtet sein. Daher folgen auf das char 3 Padding-Bytes.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout s = MemoryLayout.structLayout(
ValueLayout.JAVA_BYTE.withName("c"),
MemoryLayout.paddingLayout(3),
ValueLayout.JAVA_INT.withName("n"));
System.out.println("Aligned struct size: " + s.byteSize());
}
}SequenceLayouts
Ein SequenceLayout beschreibt ein Array. MemoryLayout.sequenceLayout(count, element) modelliert beispielsweise ein Array aus 10 doubles.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
SequenceLayout arr = MemoryLayout.sequenceLayout(10, ValueLayout.JAVA_DOUBLE);
System.out.println("Array bytes: " + arr.byteSize());
}
}Verschachtelte Layouts
Layouts lassen sich zusammensetzen. Eine Struktur kann eine Sequenz enthalten, und eine Sequenz kann Strukturen enthalten. Mit Pfadausdrücken wie sequenceElement() und groupElement(name) navigieren Sie durch tief verschachtelte Daten.
Damit lassen sich reale C-Datenstrukturen beliebiger Komplexität abbilden.
Offsets und Slicing
Sie können den byteOffset eines Feldes über seinen Pfad abfragen und mit segment.asSlice(offset, size) ein Teilsegment erhalten. Das ist nützlich, um ein einzelnes Feld einer Struktur an eine native Funktion zu übergeben.
Kurzer Test
Rufen Sie sich eine häufige Stolperfalle bei Strukturen ins Gedächtnis.
Zusammenfassung
Sie haben gelernt, native Daten zu beschreiben:
- Layout-Familie:
ValueLayout,SequenceLayout,StructLayout,UnionLayout - Felder mit
withNamebenennen; überVarHandleund Pfadelemente darauf zugreifen - Für die korrekte Ausrichtung explizit
paddingLayouthinzufügen - Verschachtelte Layouts zusammensetzen und mit
asSliceTeilbereiche ausschneiden
Damit ist der Kurs zur Foreign Function and Memory API abgeschlossen.
Häufig gestellte Fragen
Ist die Lektion „Layouts und Structs“ kostenlos?
Ja — der vollständige Text von „Layouts und Structs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Layouts und Structs“?
Native Speicherlayouts beschreiben Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Layouts und Structs“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum FFM statt JNI
- MemorySegment und Arena
- Downcall Handles
- Layouts und Structs