SE1-WiSe06-Klausur-Fehler

Aus Fachschaft_Informatik
Version vom 4. September 2007, 12:20 Uhr von fsrwiki_>1illig (Code noch weiter verkürzt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.