Java - be-annotierten Klassen
Ich weiß, es gibt unglaubliche Sammlung von tools für das laden von plugin-Klassen in java, ist aber heute eine Idee kam mir in den Sinn.
Was ist, wenn ich habe eine Reihe von annotierten und nicht-annotierten Klassen im Paket "org.home.junk" (versehen mit annotation "@AnnotatedClass") und diese Klassen haben annotierten Methoden mit sagen annotation "@AnnotatedMethod".
Erste Frage: kann ich zur Laufzeit erhalten Sie ein array/collection von allen Klassen in diesem Paket, so dass ich kontrollieren könnte, welche versehen sind, und erstellen Sie eine Instanz von Ihnen. (Ich bin mir bewusst, jedoch wie um zu überprüfen, ob Some.class hat Anmerkungen mit freundlicher Genehmigung von diese Anleitung: http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/)
Zweite Frage: - Wenn ich das tun kann, was ich möchte in der ersten Frage - was wäre die politische Möglichkeit, dies zu tun?
Ich glaube, dass es möglich ist, so wie ich das verstehe JUnit Lasten, test-case-Klassen in einer ähnlichen Art und Weise.
Es wäre auch cool, wenn das getan werden könnte, mit minimalen Bibliotheken von Drittanbietern und solche, wieder - wenn es möglich ist 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste Antwort: werfen Sie einen Blick auf dieses Projekt.
Gibt es alle Klassen von
org.home.junk
kommentiert mitjavax.persistence.Entity
annotation.Zweite Antwort: erstellen neue Instanz der genannten Klassen können Sie dies tun
Hoffe das beantwortet alles.
Es kann getan werden, mit Techniken, überprüfen Sie das Dateisystem, denn es ist mehr ein classloader-Problem als ein Spiegelbild einer. Überprüfen Sie dies: Sie finden alle Klassen in einem Paket mit der spiegelung?.
Wenn Sie können überprüfen, alle class-Dateien, die sich in einem Verzeichnis, können Sie leicht die entsprechende Klasse mit dieser Methode
Wissen, ob eine Klasse annotiert ist oder nicht, ist eine Reflexion Problem. Erste Anmerkungen in einer Klasse verwendet, wird auf diese Weise getan:
Definieren Sie Ihre benutzerdefinierten Beschriftung mit einer Aufbewahrungsrichtlinie Typ zur Laufzeit sichtbar.
Dieser Artikel ist eine gute Ressource für mehr Infos: http://tutorials.jenkov.com/java-reflection/annotations.html.
Wenn Sie Spring(3rd party, sorry :-)), verwenden Sie das org.springframework.Kontext.Anmerkung.ClassPathScanningCandidateComponentprovider
Ein code-Beispiel zur Verwendung finden Sie in diese Frage ALSO
Alles hängt davon ab, welche Anforderung Sie haben für die Anmerkung.
Wie z.B.
@EJB
: Diese Anmerkung ist so konzipiert, dass die container identifizieren, und tun EJB-Spezifische Arbeit, die erfordert das Scannen von Dateien und dann finden solche Klassen.Allerdings, wenn Ihre Voraussetzung ist nur, um bestimmte Funktionen zu aktivieren, basierend auf der annotation dann kann man es mit java nur Reflexion
z.B.
@NotNull
: Diese annotation ist im JSR 303, um zu überprüfen, dass Annotierten element nicht null ist. Diese Funktion kann einfach umgesetzt werden, zur Laufzeit mit reflection-API