Vi har redan pratat om det faktum att klasser är komplexa datatyper. Låt oss nu prata lite om den andra sidan av klasser - hur klasser hanteras av Java-maskinen. Kom ihåg att i Java är allt ett objekt, till och med en klass. En klass är ett objekt. Förvånar det dig? Låt oss sedan fortsätta.
Laddar en klass i minnet
I själva verket, när en klass laddas in i minnet, skapas tre speciella "objekt":
Kort beskrivning av illustrationen:
Gul rektangel:
Kodfilen lagras på disken som en fil med filtillägget ".class". Den innehåller information om klassen, dess fält och metoder, såväl som källkoden för metoder som kompileras till bytecode.
Orange rektangel:
När Java-maskinen laddar en klass i minnet, kompilerar den bytekoden till maskinkod som är specifik för datorns processor och operativsystem. Endast Java-maskinen har tillgång till denna maskinkod. Som Java-programmerare har vi inte tillgång till det.
Grön rektangel:
Java-maskinen skapar ett objekt som innehåller alla statiska variabler och metoder för klassen. Du kommer åt detta "objekt" med hjälp av klassnamnet.
Till exempel när du skriver hänvisar du till den statiska variabeln som finns i klassen. Detta objekt är vår gröna rektangel. Och det är där den statiska variabeln lagras.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI
Blå rektangel:
När Java-maskinen laddar koden för en klass i minnet, skapar den ett speciellt java.lang.Classobjekt, som lagrar information om den laddade klassen: dess namn, metodnamn, fältnamn och typer, etc.
Namnet "Klass" kan vara lite förvirrande. Det skulle vara mer meningsfullt att kalla det ClassInfo, eftersom den här klassen bara lagrar lite information om den laddade klassen.
Du kan hämta Class-objektet för vilken typ som helst med ett kommando så här:
Class name = ClassName.class;
Exempel:
| Koda | Notera |
|---|---|
|
Skaffa ett Classobjekt med information om Stringklassen |
|
Skaffa ett Classobjekt med information om Objectklassen |
|
Skaffa ett Classobjekt med information om Integerklassen |
|
Skaffa ett Classobjekt med information om inttypen |
|
Skaffa ett Classobjekt med information om voidtypen |
Du kan också få en referens till ett klassbeskrivningsobjekt från vilket objekt som helst, eftersom varje objekt har metoden getClass()som det ärver från Objectklassen.
Exempel:
| Koda | Notera |
|---|---|
|
Samma objekt somString.class |
|
Samma objekt somInteger.class |
|
Samma objekt somBoolean.class |
GO TO FULL VERSION