SE1-WiSe06-Klausur-Fehler: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
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 getSecretCode() {
   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().getDeclaredMethods()) {
     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.getParameterTypes().length == 0)
       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().getDeclaredFields()) {
     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.printStackTrace();
       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.