# Annotations mit Vererbung



## loeppel (19. Jun 2008)

Hi,

ich arbeite mit einem Framework das Properties unterstützt.
Diese sind im grunde einfach eine Hashtable in einem BaseObject.

Jetzt möchte ich gerne die Möglichkeit hinzufügen ein Feld einer Klasse als Property via Annotations zu "markieren".
Das markieren an sich funktioniert auch schon recht gut.

Also nochmal schnell:
- im BaseObject lese ich in einem non-static-initializer (ähnlich einem Konstruktor) die Annotations für Fields aus
- alle anderen Objekte Erben von BaseObject

Problem: Der Code im BaseObject findet NUR Annotations in seiner Klasse, und nicht auch die in den Abgeleiteten.

Was kann man dagegen tun?

Etwas Code, irgendwie bin ich nicht gut im Umschreiben ;-)

Auszug aus BaseObject.java

```
public Hashtable<String, Object> annotedPropertyFields;

  @MyProperty(name="testProp")
  public String                    test         = "myTests";

  //
  // non static initializer
  //
  {
    /**
     * Annotations for Propertys
     */
    annotedPropertyFields = new Hashtable<String, Object>();

    Class<MyProperty> myPropteryAnnotation = MyProperty.class;

    Field[] fields = getClass().getFields();

    for( int i = 0; i < fields.length; i++ )
    {
      if( fields[i].isAnnotationPresent( myPropteryAnnotation ) )
      {
        MyProperty propertyAnnotation = fields[i].getAnnotation( myPropteryAnnotation );

        System.out.print( propertyAnnotation.name() );

        annotedPropertyFields.put( propertyAnnotation.name(), fields[i] );
      }
    }
    /* --- */
  }
```




```
public class Test extends BaseObject {

@MyProperty(name="propName")
public String justAFiled = "blubb";

}


Test asdf = new Test();
```

in *asdf* enthält in *annotedPropertyFields* jetzt NUR testProp => myTests, NICHT propName => blubb !!!

Jemand ne Idee?


Gruß,
loeppel


----------



## byte (19. Jun 2008)

Du musst das ganze für alle Superklassen wiederholen (siehe Class#getSuperclass()).


----------



## loeppel (19. Jun 2008)

Hmm, ok, aber dann kann ich ja nur von oben nach unten machen.
Also muss der Code ja im grunde in die Klasse test.java und sich da dann die Superclasses holen (bei tieferen verschachtelungen).

Ich will aber ja das der Code für das Sammeln der Annotations in BaseObject bleibt.

Oder hab ich da jetzt einen Denkfehler?

Gruß,
loeppel


----------



## byte (19. Jun 2008)

loeppel hat gesagt.:
			
		

> Hmm, ok, aber dann kann ich ja nur von oben nach unten machen.
> Also muss der Code ja im grunde in die Klasse test.java und sich da dann die Superclasses holen (bei tieferen verschachtelungen).
> 
> Ich will aber ja das der Code für das Sammeln der Annotations in BaseObject bleibt.
> ...



Ja, Du hast einen Denkfehler.  Methoden in Java sind polymorph, getClass() in BaseObject liefert zur Laufzeit die konkrete Implementierungsklasse zurück. Der Code kann also bleiben wo er ist.


----------



## loeppel (19. Jun 2008)

Hmm, naja das dachte ich ja auch das getClass() mir die "richtige" Klasse liefert. Allerdings ist es ja eben so das die Annotation von *BaseObject* da sind und die von *Test nicht*!

Deswegen zerstört das ja mein Weltbild ;-)

Anderstrum wäre es logisch ja.

Hab das mit getSuperclass() eingebaut -> Keine veränderung (was aber ja auch klar ist denn ich gehe mit getSuperClass() ja im grunde den Weg in die "falsche richtung")

Gruß,
loeppel


----------

