# Informationen über abgeleitete Klassen



## Mewel (6. Dez 2006)

Hallo,

mein Problem ist folgendes:

Ich habe eine Basisklasse mit dem Namen Test, von dieser Klasse sind 2 weitere abegeleitet mit dem Namen TestA und TestB.

In einer anderen Klasse versuche in nun an TestA oder TestB heranzukommen. Dabei habe ich aber nur Informationen über die Klasse Test und einen ZusatzString der mir Informationen über die Klasse TestA oder TestB gibt.

Wie komme ich nun über die Basisklassen an TestA oder TestB ran?


Die Testklassen:


```
public abstract class Test {
  public String getInformation() {
    return "Test";
  }
}


public class TestA extends Test {

  public String getInformation() {
    return "TestA";
  }
}

public class TestB extends Test {

  public String getInformation() {
    return "TestB";
  }
}
```

Die Methode die TestA oder TestB zurückgeben soll:
information = "TestA"
baseClass = Test


```
public static Object getTestObject(String information, Class baseClass) {
  ...
  if(baseClass.equals(Test.class)) {
    <-- hier der gewünschte Code :D
  }
  ...
}
```

Im Endeffekt will ich eine Instanz von TestA oder TestB zurückgeben.

mfg Mewel


ps. falls einer sagt suchfunktion nutzen, ich habe ka unter welchem Stichpunkt ich da suchen sollte


----------



## Wildcard (6. Dez 2006)

Wo ist jetzt das Problem? Wenn im String TestA steht erzeugst du eben eine entsprechende Instanz und gibst sie zurück.


----------



## Gast (6. Dez 2006)

Tst vllt. etwas unglücklich ausgedrückt, aber die Information ist nicht immer identisch mit dem Klassennamen oder dem Classpath.


----------



## Wildcard (6. Dez 2006)

Dann versuch dich mal 'glücklicher' auszudrücken  :wink:


----------



## Mewel (6. Dez 2006)

Du meinst ich soll einfach:


```
if(information.equals(TestA.getInformation()) {
  return new TestA();
}
```

Sicher ist das eine Möglichkeit, aber nicht die von mir angestrebte dynamische. So müsste ich immer, wenn ich eine neue von Test abgeleitete Klasse schreibe, eine neue if-Abfrage machen.

ps. die Methode getInformation() ist natürlich static


----------



## Wildcard (6. Dez 2006)

Wie stellst du dir den eine dynamische Lösung vor?
Den Classpath nach Klassen durchsuchen die Test erweitern und mit Reflection Instanzen erstellen?  :autsch: 
Gibt es einen Grund für dieses 'ungwöhnliche' Design?


----------



## Mewel (6. Dez 2006)

Der Grund ist, das ich die Informationen aus einer xml-Datei auslese die ich selber nicht beeinflussen kann.

Ich bin halt kein fan von ewig langen if-abfragen.

Mit dem Reflection Instanzen hast du schon recht, das muss ich machen.

Und wie ich mir die dynamische Lösung vorstelle wollt ich halt von euch wissen . Weil mir fällt da leider nix ein :/.


----------



## Wildcard (6. Dez 2006)

Es währe ja kein Problem wenn diese 'information' dem gesuchten Klassenname entsprechen würde, da das aber wie du sagst nicht gegeben ist, hast du keine reelle Chance.


----------



## Mewel (6. Dez 2006)

Hrm, uncool, ich hatte halt an so eine art gedacht, das man von einer Klasse alle abegeleiteten bekommt und die dann durchiteriert. Aber ich habe dazu auch nichts gefunden.

Weil das Problem an sich ist ja nicht wirklich komplex, dachte halt das es da Lösungsmöglichkeiten gibt.


----------



## Wildcard (6. Dez 2006)

Eine Klasse kennt aber ihre abgeleiteten Klassen nicht. Kann sie auch gar nicht.
Vergiss auch nicht das Klassen nicht immer als Dateien oder überhaupt lokal vorliegen. 
Stell dir mal vor du würdest eine Liste aller Klassen bekommen die von JFrame abgeleitet sind  :wink:


----------



## clemson (6. Dez 2006)

Mewel hat gesagt.:
			
		

> Weil das Problem an sich ist ja nicht wirklich komplex, dachte halt das es da Lösungsmöglichkeiten gibt.



so unkomplex ist das gar nicht: was ist, wenn du alle abgeleiteten klassen von java.lang.Object haben willst...

für deinen fall könntest du dich ja auf ein package beschränken, alle klassen des packages laden und überprüfen, ob sie von einer bestimmten klasse abgeleitet sind bzw. ein bestimmtes interface implementieren...

EDIT: zu spät  :cry:


----------



## Wildcard (6. Dez 2006)

clemson hat gesagt.:
			
		

> für deinen fall könntest du dich ja auf ein package beschränken, alle klassen des packages laden und überprüfen, ob sie von einer bestimmten klasse abgeleitet sind bzw. ein bestimmtes interface implementieren...


Man *kann nicht* alle Klassen eines packages laden.


----------



## clemson (6. Dez 2006)

Wildcard hat gesagt.:
			
		

> Man *kann nicht* alle Klassen eines packages laden.



na eh. aber man könnte alle klassen des eines bestimmten packages laden, welche im classpath sind, oder?


----------



## Wildcard (6. Dez 2006)

Du kannst dir alles anschauen was im Classpath ist, aber was ist wenn du Klassen aus einer DB oder dem Internet liest? Was ist wenn du über einen eigenen Classloader Klassen zur Laufzeit aus einem byte[] erzeugst?
Es gibt einen Grund warum die Klasse Package keine getClasses Methode hat  :wink:


----------



## clemson (6. Dez 2006)

hmm, okay. du hast recht.

nur noch soviel: in diesem fall gehe ich davon aus dass die klassen lokal auf der festplatte liegen. und auch wenns kein schöner ansatz is, aber für diesen fall würds gehen...


----------



## Wildcard (6. Dez 2006)

Richtig. Allerdings ist das ein ziemlicher hack und definitiv schlechter als ein zusätzliches 'if' in einer Factory.
So zumindest meine Meinung.


----------



## clemson (6. Dez 2006)

um das wort auch mal zu verwenden: da bin ich ganz unisono mit dir...


----------



## Wildcard (6. Dez 2006)

clemson hat gesagt.:
			
		

> um das wort auch mal zu verwenden: da bin ich ganz unisono mit dir...


 :lol:


----------



## Mewel (7. Dez 2006)

Jop, thx nochma, werds irgendwie anders lösen .


----------

