Ermitteln und Setzen der Attribute eines Objektes

Stefan Dreis

Mitglied
Wie bereits in meinem ersten Thread kurz erwähnt komme ich aus der PHP Welt.

Hier ist z.B. folgendes Möglich (ohne Prüfung auf Richtigkeit):

PHP:
      class MyClass {
              var $myattrib = "Mein Attribut";
      }

      $my_class   = new MyClass();
      $class_vars = get_class_vars(get_class($my_class));

      foreach ($class_vars as $name => $value) {
                 echo "$name : $value\n";
     }

    $attributname = "myattrib";
    $my_class->$attributname = 30;
    echo "Der Wert von MyClass:myattrib = " . $my_class->myattrib;

Um die möglichen Werte eines Objektes zu ermitteln und zu setzen. Die Ausgabe des PHP Skripts sähe demnach wie folgt aus:

Code:
    myattrib : 20
    Der Wert von MyClass:myattrib = 30

Wie kann man in Java

  • die Attribute einer Klasse ermitteln
  • den Wert eines namend Attributs ändern

Da ich mich nebenbei auch etwas mit Spring beschäftige kenne ich zwar die BeanInjection allerdings ist dieses ja nur der Weg "definier Wert in XML - Datei" -> "weise Werte eines Objekts zu". Aber bietet evtl. Spring eine Möglichkeit in der Form:

PHP:
    class myObject {
    /**
     * bind
     * 
     * binds data to object
     * 
     * @access      public
     * @param       $from   mixed   ein assoziertes Array oder ein Objekt
     * @return      boolean
     */
     public function bind( $from ) {
            $fromArray      = is_array( $from );
            $fromObject     = is_object( $from );

            if (!$fromArray && !$fromObject) {
               $this->addError( get_class( $this ).'::bind failed. Invalid from argument' );
               return false;
            }
                
            foreach ($this->getAttributes() as $k => $v) {
                    if ($fromArray && isset( $from[$k] )) {
                        $this->$k = $from[$k];
                    } else if ($fromObject && isset( $from->$k )) {
                        $this->$k = $from->$k;
                    }
            }
                
            return true;
     }
}

also in der form bind( HashMap<Key, Value> )?

Danke für eure Hilfe
Stefan
 
Zuletzt bearbeitet von einem Moderator:
Reflection heißt das große Zauberwort,
damit findest du die Befehle,

zu einer Map der Werte ist mir nichts allgemein gebräuchliches bekannt,
bei derartigen Bearbeitungen (alle Werte herausholen) kommt man daran aber sicher selber vorbei
 
Ok, danke erstmal. Hab mir

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 24.3 Attribute, Methoden und Konstruktoren

angesehen. Man kann den Namen und den Typ ermitteln, aber 2 Sachen sind mir noch unklar

  • wie ermittelt den Wert eines Attributes
  • wie findet man private Attribute?

hiermal an einem kleine Pseudocode-Beispiel:

Code:
    class myBaseClass {
            Map<String, String> getAttributes() {
                                           ???
            }
    }

   class myClass extends myBaseClass {
           private  String vorname   = "Stefan"
           private  String nachname = "Dreis"

           getVorname() { return vorname; }
           getNachname() { return vorname; }
   }

   class testClass {
           public void func {
                      myClass c = new myClass();
                      myClass.getAttributes();       // Map{ "vorname" = "Stefan", "nachname" = "Dreis" }
           }
   }
 
das Kapitel ist in der Tat überraschend unvollständig, aber es gibt ja noch die API
Field (Java Platform SE 6)

oder Suchmaschine 'java attribut auslesen reflection' 😉

edit:
im Buch gehts erst unter
> 24.4.2 Die Belegung der Variablen erfragen
weiter


> wie findet man private Attribute?

schaue dir in Class alle Methoden an, die Fields zurückgeben,
eine davon wird schon klappen wenn andere vielleicht auf public beschränkt ist
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

denke du bist auf dem Holzweg, PHP und Java sind unterschiedlich genug, wirst mit deinem Lösungsansatz in Java mehr Probleme als Lösungen haben.

Anfänger sollten mit Refelection gar nix zu tun haben, würde dirvorschalgen dir erstmal anzusehen wie man Dinge normalerweise in Java macht.
"Ermitteln und setzen der Attribute eines Objektes" kommt im Normalfall so gar nicht vor, man kennt ja die Attribute eines Objektes zur Entwicklungszeit und braucht diese deswegen gar nicht dynamisch zu ermitteln, setzen von Werten macht man mit Mutatoren, wie zB. sog. "Setter" Methoden.
 
Gar nicht, darum sind sie ja privat. Ob das mit Reflection geht, keine Ahnung...

Nur der vollständigkeits halber... Mit Reflection gehts ohne größere Probleme, allerdings sollte man sich damit vorallem wenn man Java erst lernt nicht damit rumspielen...

Lg

[EDIT]
Hört sich vielleicht etwas "böse" an, dass man das machen kann, allerdings gibts in Java den eingebauten SecurityManager, mit dem man selbst solche Reflections-Zugriffe sehr leicht unterbinden kann.
[/EDIT]
 
Zuletzt bearbeitet:

Zurück
Oben