Wenn wir diese Java Klasse compilieren und ausführen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class RaetselDesMonats { private static final String HALLO_WELT = "Hallo Welt!"; public static void main(String[] args) throws Exception { wieSiehtDieMethodeAus(); String welt = "Hallo Welt!"; System.out.println(welt); System.out.println("Hallo Welt!"); System.out.println(HALLO_WELT); } private static void wieSiehtDieMethodeAus() throws Exception { // nur hier Anpassungen möglich } } |
Welche Lösung bzw. Aussage ist richtig?
1. Es wird immer folgende Ausgabe gemacht, egal was in der wieSiehtDieMethodeAus()
ergänzt wird:
Hallo Welt!
Hallo Welt!
Hallo Welt!
2. Es wird „nichts
“ ausgegeben.
3. Es wird Hallo Welt!
ausgegeben
4. Es kann durch Anpassung, nur in der Methode wieSiehtDieMethodeAus() folgende Ausgabe erzeugt werden?
Was in Java alles geht!
Was in Java alles geht!
Was in Java alles geht!
Dein Vorschlag in Form von 1,2,3 oder 4 bitte posten. Nur Mut!
Hier nun die Lösung:
1 2 3 4 5 |
private static void wieSiehtDieMethodeAus() throws Exception { java.lang.reflect.Field f = String.class.getDeclaredField("value"); f.setAccessible(true); f.set("Hallo Welt!", "Was in Java alles geht!".toCharArray()); } |
In Java werden gleiche Stings nur einmal intern gespeichert. Die String Klasse speichert in dem Feld value. Auf das kann per reflection zugegriffen werden, wenn die Zugriffsbeschränkung mit setAccessible aufgehoben wird. So wird jedes „Hallo Welt!“ durch „Was in Java alles geht!“ ersetzt.
Auf einen Import, kann man so auch verzichten.
Auch in den Kommentaren sind gute Ideen, vielen Dank.