SE1-WiSe06-Klausur-Fehler
Version vom 4. September 2007, 12:20 Uhr von fsrwiki_>1illig (Code noch weiter verkürzt)
Im Forum gibt es einen Thread, in dem ueber Fehler in der SE1 Klausur im WiSe 06 diskutiert wird.
int und float
Ein Fehler ist folgender:
Welche Aussagen sind zu folgendem Java-Code richtig: (Es gibt nur eine richtige Antwort) a = 42 + a; a) : a kann nicht vom Typ 'String' sein b) : a könnte vom Typ float sein c) : a könnte vom Typ boolean sein d) : a könnte vom Typ int sein
Dass a sowohl ein int als auch ein float sein kann wurde jedoch bei der Korrektur beruecksichtigt.
Accessing private methods
Eine weitere Frage lautete Sinngemaess:
Welche Aussagen treffen auf Java zu? [...] ) Auf private Felder und Methoden kann nur von der jeweiligen Klasse aus zugegriffen werden
Diese Antwort war anzukreuzen, ist jedoch falsch. Mit hochoffiziellen Mitteln der Sprache Java ist es möglich, an private Felder und Methoden einer Klasse heranzukommen.
Hier ein Beispielcode:
// Secret.java public class Secret { private String secretCode = "geheim"; private String getSecretCode() { return secretCode; } }
// Hacker.java import java.lang.reflect.Field; import java.lang.reflect.Method; public class Hacker { public void disclose(Object o) throws Exception { System.out.println("Methoden:"); for (Method m : o.getClass().getDeclaredMethods()) { /** * Hier ist der große Knackpunkt: Mit diesem Trick kann man * "private"-Methoden (und Felder, siehe unten) zugreifbar machen. * Sie verhalten sich dann wie "public"-Methoden. */ m.setAccessible(true); if (m.getParameterTypes().length == 0) System.out.println(" " + m.getName() + ": " + m.invoke(o)); } System.out.println("Datenfelder:"); for (Field f : o.getClass().getDeclaredFields()) { f.setAccessible(true); System.out.println(" " + f.getName() + ": " + f.get(o)); } } public static void main(String[] args) { Secret secret = new Secret(); Hacker hacker = new Hacker(); try { hacker.disclose(secret); } catch (Exception e) { e.printStackTrace(); } } }
Die Aussage in der Aufgabenstellung müsste daher korrekterweise lauten: Auf "private" Felder und Methoden kann von außerhalb der Klasse nur mit fiesen Hackermethoden zugegriffen werden.