Wann wird eine Klasse geladen?

Status
Nicht offen für weitere Antworten.

sirbender

Top Contributor
Um zu verfolgen wann eine Klasse geladen wird habe ich ganz oben folgenden code eingefuegt:

static {
System.out.println("Enter XYZClass");
}



Ich uebergebe diese Klasse einer Methode. "Enter XYZClass" wird aber noch nicht ausgedruckt. Was geschieht mit der Klasse an diesem Punkt? Wird nur der Classloader gebeten die Klasse aus dem JAR zu laden? Sonst nichts?

Werden an diesem Punkt bereits Annotationen ausgewertet?

Wann wird eine Klasse tatsaechlich geladen...d.h. komplett interpretiert? Wenn man auf eine Variable zugreift bzw. eine Instanz erstellt?
 

palador

Mitglied
Das static {...} dient ja eigentlich dazu, statische Felder in einer Klasse zu initialisieren. Das passiert aber erst bevor du ein statisches Feld von irgentwo aufrufst. Wenn du gar kein solches Feld dekladiert hast, wird dein "static-constructur" also niemals aufgerufen.
 

sirbender

Top Contributor
doch der wird aufgerufen...z.B. wenn ich eine Instanz der Klasse erstelle oder wenn ich eine statische Variable der Klasse aufrufe.

Was nicht ausreicht fuer den Aufruf, ist es das Klassen-objekt Class<MeineKlasse> irgendwo zu benutzen.
 
B

bygones

Gast
Das static {...} dient ja eigentlich dazu, statische Felder in einer Klasse zu initialisieren. Das passiert aber erst bevor du ein statisches Feld von irgentwo aufrufst. Wenn du gar kein solches Feld dekladiert hast, wird dein "static-constructur" also niemals aufgerufen.

nein sobald die Klasse geladen wird... wann immer das auch ist.

ansonsten wuerde folgendes nicht funktionieren
Java:
public class Foo() {
  private static int bar;

  static {
     bar = 42;
  }

  public void fooBar() {
     System.out.println(bar);
  }
}
 
S

SlaterB

Gast
ich denke auch, beobachtet zu haben, dass die statischen Variablen (auch) bereits beim ersten nicht-statischen Zugriff initialisiert werden,
aber wieso sollte das Beispiel anderenfalls nicht funktionieren?

die Aussage "Das passiert aber erst bevor du ein statisches Feld von irgentwo aufrufst."
würde doch genauso zum ersten Aufruf von fooBar() passen ;)

würde fooBar() nämlich
public void fooBar() {
System.out.println(AndereNochNichtInitialisierteKlasse.bar);
}
lauten, wäre das ganze doch sogar tatsächlich der Fall,
erst beim Aufruf von fooBar() wird AndereNochNichtInitialisierteKlasse initialisiert
 
S

Spacerat

Gast
...Naja... Laut Tests bewirkt das alleinige Laden noch nicht die Ausführung des "static"-Constructors. Ich kann ein geladenes Class-Objekt in einer Anwendung hin und her schieben, übergeben oder sonstwas. Erst wenn ich einen Member (Konstruktor, Feld, Methode) der Klasse aufrufe oder verwende, wird die Klasse initialisiert. Das initialisieren kann aber auch durch "Class.forName(classname, true, classloader)" forciert werden.
Geladen wird eine Klasse bereits, wenn sie von einer anderen importiert wird, beim Prüfen der Abhängigkeiten oder eben durch Klassen-Lade-Methoden wie oben.
 

tfa

Top Contributor
...Naja... Laut Tests bewirkt das alleinige Laden noch nicht die Ausführung des "static"-Constructors. Ich kann ein geladenes Class-Objekt in einer Anwendung hin und her schieben, übergeben oder sonstwas. Erst wenn ich einen Member (Konstruktor, Feld, Methode) der Klasse aufrufe oder verwende, wird die Klasse initialisiert. Das initialisieren kann durch "Class.forName(classname, true, classloader)" forciert werden.
Wie kannst du ein "geladenes Class-Objekt" haben, ohne dass vorher ein Konstruktor oder eine Methode aufgerufen wurde? Zeig mal den Test.
Geladen wird eine Klasse bereits, wenn sie von einer anderen importiert wird, beim Prüfen der Abhängigkeiten oder eben durch Klassen-Lade-Methoden wie oben.

Code:
import
(wenn du das meinst) ist nur eine Anweisung für den Compiler. Zur Laufzeit existieren die nicht mehr.
 
S

Spacerat

Gast
1. Class-Objekt:
Java:
Class<?> clazz = Class.forName("mypackage.MyClass");
...eine Instanz der Klasse "Class" halt.
2. Zugegeben, das mit der Importanweisung ist nicht wirklich richtig. Im Bytecode tauchen aber statt irgendwelcher Importanweisungen alle verwendeten Klassen namentlich an den Stellen auf, wo sie halt verwendet werden. Die Erklärung mit der Importanweisung fällt nur wesentlich leichter.
@Noctarius: He... Danke... So klingts gut. \/\/
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Import existiert zwar im Bytecode nicht mehr, beim Ladeb einer Klasse werden aber trotzdem alle Abhängigkeiten gelinkt und damit der Abhängigkeitenbaum der Klasse aufgebaut. Sprachlich "importiert" (bzw läd) er also schon noch die Klassen zum Linken ;-)
 

sirbender

Top Contributor
Was ist denn Performance-maessig teuer?

Das Laden von Klassen sollte ja schnell gehen, da bei einer Klasse auch alle abhaengigen Klassen geladen werden muessen, oder?

Das Initialisieren einer Klasse sollte dagegen langsam sein - nehme ich zumindest an. Stimmt das?
 
S

Spacerat

Gast
Ja, und dadurch wir die Klasse initialisiert, d.h. der statische Initialisierer wird aufgerufen.
Komisch... bei mir nicht. Wenn ich dagegen
Java:
Class<?> clazz = Class.forName("mypackage.MyClass", true , classloader);
aufrufe...
@Edit: Und wenn ich es mir genau überlege, könnte es beim Laden von Klassen unter Umständen performancemässig ein hübsches Gedrängel geben, wenn sie bei der besagten Abhängigkeitsprüfung gleich initialisiert würden.
 
Zuletzt bearbeitet von einem Moderator:

Noctarius

Top Contributor
Das Laden einer Klasse ist grundsätzlich teuer, daher werden ja auch im Normalfall alle einmal geladenen Klassen vom Classloader gehalten (er darf allerdings nicht mehr genutzte Klassen abräumen um Speicher freizugeben).

Was meinst du mit Initialisieren? Meinst du Instanzieren?
 
B

bygones

Gast
Komisch... bei mir nicht. Wenn ich dagegen
Java:
Class<?> clazz = Class.forName("mypackage.MyClass", true , classloader);
aufrufe...
das funktioniert:
Java:
public class K {
    public static void main(String[] args) throws Exception {
        Class.forName("test.FooBar");
    }
}

class FooBar {
    static {
        System.out.println("foobar");
    }
}
ausgabe ist [c]foobar[/c]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
W Wann Rückgabewerte 0, 1, -1? Java Basics - Anfänger-Themen 27
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben