ich so etwas wie dies wollen erweitern tun:zur Laufzeit alle Klassen in einer Java-Anwendung finden, die eine Basisklasse
List<Animal> animals = new ArrayList<Animal>();
for(Class c: list_of_all_classes_available_to_my_app())
if (c is Animal)
animals.add(new c());
Also, ich in meiner Anwendung Universum an alle Klassen aussehen wollen, und Wenn ich ein Objekt finde, das von Animal stammt, möchte ich ein neues Objekt dieses Typs erstellen und es der Liste hinzufügen. Dadurch kann ich Funktionalität hinzufügen, ohne eine Liste von Dingen aktualisieren zu müssen. Ich kann die folgende vermeiden:
List<Animal> animals = new ArrayList<Animal>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Donkey());
...
Mit dem obigen Ansatz, kann ich einfach eine neue Klasse erstellen, das Tier erweitert und es wird automatisch abgeholt.
UPDATE: 2008.10.16 09.00 Uhr Pacific Standard Time:
Diese Frage viele große Antworten erzeugt hat - danke. Aus den Antworten und meinen Nachforschungen habe ich herausgefunden, dass das, was ich wirklich tun möchte, unter Java nicht möglich ist. Es gibt Ansätze, wie den ServiceLoader-Mechanismus von ddimitrov, die funktionieren können - aber sie sind sehr schwer für das, was ich will, und ich glaube, ich verschiebe das Problem einfach von Java-Code in eine externe Konfigurationsdatei.
Eine andere Möglichkeit zu sagen, was ich will: Eine statische Funktion in meiner Animal-Klasse findet und instanziiert alle Klassen, die von Animal erben - ohne weitere Konfiguration/Codierung. Wenn ich konfigurieren muss, kann ich sie auch einfach in der Tierklasse instantiieren. Ich verstehe das, weil ein Java-Programm nur eine lose Vereinigung von .class-Dateien ist, so ist es genau so.
Interessanterweise scheint dies fairly trivial in C# zu sein.
Nach einer Weile suchen, so scheint es, dass dies eine schwierige Nuss in Java zu knacken. Hier ist ein Thread, der einige Informationen hat: http://forums.sun.com/thread.jspa?threadID=341935&start=15 Die Implementierungen in es sind mehr als ich brauche, ich denke, ich bleibe nur bei der zweite Implementierung für jetzt. – JohnnyLambada
Setzen Sie das als Antwort und lassen Sie die Leser darüber abstimmen – VonC
Der Link dazu in C# macht nichts Besonderes. Eine C# -Assembly entspricht der Java-JAR-Datei. Es ist eine Sammlung kompilierter Klassendateien (und Ressourcen). Der Link zeigt, wie die Klassen aus einer einzelnen Assembly abgerufen werden. Sie können es fast so einfach mit Java machen. Das Problem für Sie ist, dass Sie alle JAR-Dateien und echte lose Dateien (Verzeichnisse) durchsuchen müssen; Sie müssten dasselbe mit .NET machen (suchen Sie einen PFAD irgendeiner Art oder verschiedener Arten). –