SE1-WiSe06-Klausur-Fehler: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
fsrwiki_>1illig K (Code noch weiter verkürzt) |
K (1 Versionen) |
||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Im [http://www.fb18.de/ Forum] gibt es einen [http://3773.rapidforum.com/topic=109872842177&startid=1 Thread], in dem ueber Fehler in der SE1 Klausur im WiSe 06 diskutiert wird. | Im [http://www.fb18.de/ Forum] gibt es einen [http://3773.rapidforum.com/topic=109872842177&startid=1 Thread], in dem ueber Fehler in der SE1 Klausur im [[WiSe]] 06 diskutiert wird. | ||
== int und float == | == int und float == | ||
Zeile 30: | Zeile 30: | ||
private String secretCode = "geheim"; | private String secretCode = "geheim"; | ||
private String | private String get[[SecretCode]]() { | ||
return secretCode; | return secretCode; | ||
} | } | ||
Zeile 46: | Zeile 46: | ||
System.out.println("Methoden:"); | System.out.println("Methoden:"); | ||
for (Method m : o.getClass(). | for (Method m : o.getClass().get[[DeclaredMethods]]()) { | ||
/** | /** | ||
* Hier ist der große Knackpunkt: Mit diesem Trick kann man | * Hier ist der große Knackpunkt: Mit diesem Trick kann man | ||
Zeile 53: | Zeile 53: | ||
*/ | */ | ||
m.setAccessible(true); | m.setAccessible(true); | ||
if (m. | if (m.get[[ParameterTypes]]().length == 0) | ||
System.out.println(" " + m.getName() + ": " + m.invoke(o)); | System.out.println(" " + m.getName() + ": " + m.invoke(o)); | ||
} | } | ||
System.out.println("Datenfelder:"); | System.out.println("Datenfelder:"); | ||
for (Field f : o.getClass(). | for (Field f : o.getClass().get[[DeclaredFields]]()) { | ||
f.setAccessible(true); | f.setAccessible(true); | ||
System.out.println(" " + f.getName() + ": " + f.get(o)); | System.out.println(" " + f.getName() + ": " + f.get(o)); | ||
Zeile 71: | Zeile 71: | ||
hacker.disclose(secret); | hacker.disclose(secret); | ||
} catch (Exception e) { | } catch (Exception e) { | ||
e. | e.print[[StackTrace]](); | ||
} | } | ||
} | } |
Aktuelle Version vom 6. November 2007, 04:32 Uhr
Im Forum gibt es einen Thread, in dem ueber Fehler in der SE1 Klausur im WiSe 06 diskutiert wird.
int und float[Bearbeiten]
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[Bearbeiten]
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 get[[SecretCode]]() { 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().get[[DeclaredMethods]]()) { /** * 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.get[[ParameterTypes]]().length == 0) System.out.println(" " + m.getName() + ": " + m.invoke(o)); } System.out.println("Datenfelder:"); for (Field f : o.getClass().get[[DeclaredFields]]()) { 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.print[[StackTrace]](); } } }
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.