Was macht static { ... } ?

Status
Nicht offen für weitere Antworten.
I

iHenning

Gast
Hi Leute,

ein Bekannter hat mir den folgenden Code gegeben, Ihr könnt ihn selbst ausführen oder mir glauben, dass er nicht "Hello world" sondern "Goodbye" ausgibt...
Ich verstehe nicht ganz warum. Könnt ihr mir helfen? Insbesondere die Funktion dieser static-"Methode" interessiert mich.

Gruß und Danke,
iHenning

Java:
public class HelloWorld {
	
	public static void main(String[] args) throws Exception {
		
		System.out.println("Hello world");
		
	}
	
	
	static {
			
		String s = "Hello world";	
		try {
			Field f = s.getClass().getDeclaredField("value");
			f.setAccessible(true);
			f.set(s, "Goodbye    ".toCharArray());
		} catch (SecurityException e) {
		} catch (IllegalArgumentException e) {
		} catch (NoSuchFieldException e) {
		} catch (IllegalAccessException e) {
		}

	}

}
 

The_S

Top Contributor
Cooles Beispiel :D .

Also der static-Block wird aufgerufen, sobald die Klasse das erste Mal "referenziert" wird. Heißt, bevor die Main-Methode ausgeführt wird. Siehe auch Java Blog Buch : 04.03.09 Statische Initialisierer .

Kommen wir zur Ausgabe von Goodbye ... Über
Code:
String s = "Hello World";
wird ein String erzeugt und dieser im Pool abgelegt (siehe Java Blog Buch : 03.02 Strings vergleichen ). Dann wird über Reflection das Feld "value" des Strings abgefragt, welches man eigentlich niemals sieht und das den eigentlichen Inhalt des Strings repräsentiert. Da dieses private ist, muss es über [c]f.setAccessible(true)[/c] "freigeschalten" werden. Anschließend wird der Wert "Goodbye" gesetzt, der exakt so lang sein muss, wie der ursprüngliche "Hello World"-String, da es sonst eine
Code:
ArrayIndexOutOfBoundsException
geben würde. In der Main-Methode soll dann "Hello World" ausgegeben werden. Im Pool liegt aber schon ein "Hello World", weshalb auf die value des sich bereits im Pool befindlichen "Pseudo Hello World" zugegriffen wird. Und diese steht auf "Goodbye".
 
B

bygones

Gast
das bps hat nicht wirklich was mit dem static konstruktor zu tun da
Java:
 public static void main(String[] args) throws Exception {
        String s = "Hello world";
        try {
            Field f = s.getClass().getDeclaredField("value");
            f.setAccessible(true);
            f.set(s, "Goodbye    ".toCharArray());
        }
        catch (SecurityException e) {
        }
        catch (IllegalArgumentException e) {
        }
        catch (NoSuchFieldException e) {
        }
        catch (IllegalAccessException e) {
        }
        System.out.println("Hello world");
    }
auch geht
 
I

iHenning

Gast
oke, schonmal danke für die antwort, das mit dem static hab ich jetzt verstanden

aber warum greifs
Java:
System.out.println("Hello world");
auf das pseudo "Hello world" zu, wenn der value geändert wurde. wie läuft da die addressierung ab?

Gruß,
iHenning
 
B

bygones

Gast
wie The_S schon erklaert hat... Java nutzt bei Strings wenn moeglich sog. Pooling.. d.h. die beiden [c]Hello World[/c] Strings sind ein und das selbe Objekt.

zb klappt hier das pooling nicht
Java:
public class Foo {

    public static void main(String[] args) {
        String s = "Hello world";
        try {
            Field f = s.getClass().getDeclaredField("value");
            f.setAccessible(true);
            f.set(s, "Goodbye    ".toCharArray());
        }
        catch (Exception e) { }
        Bar.fooBar();
    }

    static class Bar {
        static void fooBar() {
            System.out.println("Hello world");
        }
    }
}
und somit gibts Hello World als Ausgabe

gleiches kommt auch beim == vergleich zu tage
Java:
public class Foo {
    public static void main(String[] args) {
        String s = "Hello world";
        String k = "Hello world";
        System.out.println(k == s); // gibt true -> pooling
        System.out.println(k == Bar.fooBar()); // gibt false
    }
}

public class Bar {
    public static String fooBar() {
        return "Hello World";
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Geeeee

Bekanntes Mitglied
Einfaches Nicht-Pooling-Beispiel wäre auch folgendes:
Java:
String s = new String("Hello World");
 

The_S

Top Contributor
@bygones dein "Hello World" in "Bar" hat ein großes W, das andere ein kleines. Das würde ich noch ausbessern ;) .

Ansonsten gibt übrigens auch das hier

Java:
import java.lang.reflect.Field;

public class HelloWorld {
    
    public static void main(String[] args) throws Exception {
        
        System.out.println("Hello world");
        
    }
    
    static {
            
        String s = new String("Hello world");   
        try {
            Field f = s.getClass().getDeclaredField("value");
            f.setAccessible(true);
            f.set(s, "Goodbye    ".toCharArray());
        } catch (SecurityException e) {
        } catch (IllegalArgumentException e) {
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
        }
    }
}

Wieder "Hello world" aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
N Division macht Probleme Allgemeine Java-Themen 14
berserkerdq2 IJVM, ich tue auf meinen Stack 100 und 120 rein, danach subtrahiere ich, macht die Maschine 100-120 oder 120-100? Allgemeine Java-Themen 8
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
M 4 Gewinnt KI macht nicht, was sie soll.. Allgemeine Java-Themen 1
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
O OOP Wie macht man das am besten OO? Allgemeine Java-Themen 8
Thallius Macht das Sinn? Allgemeine Java-Themen 30
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
X Was macht folgender Code!? Allgemeine Java-Themen 6
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
M Google App Engine macht Probleme Allgemeine Java-Themen 4
GilbertGrape Warum macht man "if(true)" Allgemeine Java-Themen 18
C Klassen Was macht diese Java-Mathe-Klasse? Allgemeine Java-Themen 2
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
S Javadoc 3d einbinden macht probleme Allgemeine Java-Themen 10
B Unix-Timestamp > Date macht Probleme. Allgemeine Java-Themen 3
T Ausdruck mit pdfBox macht Probleme Allgemeine Java-Themen 2
B jar File macht probleme wegen einer Methode! Allgemeine Java-Themen 5
alderwaran jaxb xsd schema, min/maxoccurs macht was? Allgemeine Java-Themen 7
S AWT StringBuffer macht nicht, was ich erwarte Allgemeine Java-Themen 2
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
N Vokabelprogramm - Wer macht mit? Allgemeine Java-Themen 58
S Anschauen was der Compiler macht..? Allgemeine Java-Themen 5
bj99 ImageIO.write() macht Probleme Allgemeine Java-Themen 7
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
P JMF macht mich verrückt Allgemeine Java-Themen 3
R PDF Formular mit JPod ausfüllen macht Probleme Allgemeine Java-Themen 4
G Wie kriegt Klasse2 die Info, was Klassse1 gerade "macht Allgemeine Java-Themen 7
Escorter was macht createHorizontalGlue() Allgemeine Java-Themen 2
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Was macht dieser Code? Allgemeine Java-Themen 13
S Was macht der Java-Verifier? Allgemeine Java-Themen 4
T Problem, warum macht der das so(finde kein titel.) Allgemeine Java-Themen 3
I Irre Website-Wie macht man sowas? Allgemeine Java-Themen 6
U if Abfrage macht etwas falsch Allgemeine Java-Themen 2
G javadoc macht probleme Allgemeine Java-Themen 2
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Vergleichen von arrays macht Probleme Allgemeine Java-Themen 2
M JBoss macht Probleme Allgemeine Java-Themen 6
P Wie macht Sun Gewinn mit Java? Allgemeine Java-Themen 3
Maximum '.' in String ersetzen macht Schwierigkeiten Allgemeine Java-Themen 2
T Klassen samt Methoden aus Jar-Archiv laden macht Problem Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben