Ich verwende Reflection, um festzustellen, ob eine Annotation, die an eine Eigenschaft einer Klasse angehängt ist, einen bestimmten Typ hat. Aktuelle ich tue:Überprüfen, ob eine Anmerkung einen bestimmten Typ hat
if("javax.validation.Valid".equals(annotation.annotationType().getName())) {
...
}
Was mich als kleines kludgey schlägt, weil es an einer Schnur beruht, die ein vollständig qualifizierter Klassenname ist. Wenn sich der Namespace in der Zukunft ändert, kann dies zu subtilen Fehlern führen.
würde ich tun:
if(Class.forName(annotation.annotationType().getName()).isInstance(
new javax.validation.Valid()
)) {
...
}
Aber javax.validation.Valid
ist eine abstrakte Klasse und nicht instanziiert werden kann. Gibt es eine Möglichkeit, instanceof
(oder grundsätzlich isInstance
) für eine Schnittstelle oder eine abstrakte Klasse zu simulieren?
Es ist eine Art Overkill, da es sowieso illegal ist, eine Annotation zu erweitern. Ich weiß nicht, ob es eine bedeutungsvolle Leistungseinbuße im Vergleich zu einfachen Gleichgestellten gibt. – Affe
@Affe Deine Lösung gesehen - mir war nicht bewusst, dass du einfach eine '.equals' oder eine' == 'on' .class' machen kannst! Dank dafür. Ich hatte den Eindruck, dass die Verwendung von '.class' einfach die' Class' Objekte und nicht die tatsächlichen Typen vergleicht. –
Die Klasse ist effektiv ein Singleton. Es ist garantiert, dass es nur eine Instanz des Klassenobjekts für einen bestimmten Typ pro Klassenlader gibt, so dass Sie sie in Java vergleichen können. – Affe