2010-07-27 11 views
13

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?

Antwort

32

Suchen Sie nur für

if (annotation.annotationType().equals(javax.validation.Valid.class)){} 

?

4

Ok, ich denke, ich hätte etwas mehr Nachforschungen anstellen müssen, bevor ich die Frage gepostet habe. Ich entdeckte, dass ich Class.isAssignableFrom(Class<?> cls) verwenden:

import javax.validation.Valid; 

if(Valid.class.isAssignableFrom(annotation.annotationType())) { 
    ... 
} 

Dies scheint die Arbeit machen. Ich bin mir nicht sicher, ob es irgendwelche Vorbehalte gibt, diesen Ansatz zu verwenden.

+1

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

+0

@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. –

+1

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

2

Da eine Anmerkung nur eine Klasse ist, können Sie einfach einen == vergleichen verwenden:

if (annotation.annotationType() == Valid.class) { /* ... */ } 
7

Nur der Vollständigkeit halber, eine andere Möglichkeit ist

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) { 
14

Oder noch einfacher:

if (annotation instanceof Valid) { /* ... */ } 
+0

Ich denke, diese Antwort sollte höher sein. Wenn Sie nur sehen möchten, ob eine Annotation-Instanz von einem bestimmten Typ ist, verwenden Sie einfach instanceOf, da es einfacher ist als annotation.annotationType(). Equals (javax.validation.Valid.class) – adevine

+3

Nur eine Beobachtung, das wird sein immer falsch, wenn der Programmierer vergisst, @interface mit @Retention (value = RUNTIME) zu kommentieren – Felype

Verwandte Themen