2013-05-03 15 views
7

Searchable.javagetAnnotations Reflection() restituisce NULL

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Searchable { } 

Obj.java

public class Obj { 
    @Searchable 
    String myField; 
} 

void main (String [] args)

Annotation[] annotations = Obj.class.getDeclaredField("myField").getAnnotations(); 

Mi aspetterei che annotations contenga il mio @Searchable. Anche se è null. Secondo la documentazione, questo metodo:

Restituisce tutte le annotazioni presenti su questo elemento. (Restituisce una matrice di lunghezza zero se questo elemento non ha annotazioni.) Il chiamante di questo metodo è libero di modificare l'array restituito; non avrà alcun effetto sugli array restituiti ad altri chiamanti.

che è ancora più strano (per me), in quanto restituisce null invece di Annotation[0].

Cosa sto facendo di sbagliato qui e più importante, come potrò ottenere il mio Annotation?

+3

Sembra funzionare sulla mia macchina. Qual è la versione di Java che stai usando su runtime? Potresti controllare la riga '@Retention (RetentionPolicy.RUNTIME)' sulla tua annotazione personalizzata? Come fai a sapere che restituisce "null"? Potresti fornire lo snippet di codice che usi? – sp00m

+1

Esattamente. Funziona con JDK 1.7.0. –

+0

@ sp00m Ho copiato dal mio IDE, RUNTIME è disponibile. So che restituisce null poiché l'ho debugato. Sto usando JDK 1.7.0. – Aquillo

risposta

5

Ho appena provato questo per te, e funziona solo:

public class StackOverflowTest { 

    @Test 
    public void testName() throws Exception { 

     Annotation[] annotations = Obj.class.getDeclaredField("myField").getAnnotations(); 

     System.out.println(annotations[0]); 
    } 
} 

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
@interface Searchable { 

} 

class Obj { 

    @Searchable 
    String myField; 
} 

ho fatto funzionare, e produce il seguente output:

@nl.jworks.stackoverflow.Searchable() 

Puoi provare a eseguire la classe di cui sopra nella vostra IDE? L'ho provato con IntelliJ, openjdk-6.

+0

Funziona, grazie. Esaminerà ulteriormente il problema, ti farà sapere. – Aquillo

+1

Non riesco a ricreare il mio problema, ma il problema è risolto copiando il tuo esempio e ricostruendolo nel mio caso, grazie Erik! – Aquillo

+0

Certo, nessun problema, felice di poterti aiutare! –

2

Il tuo codice è corretto. Il problema è da qualche altra parte. Ho appena copiato ed eseguito il tuo codice e funziona.

È possibile che si stia importando la classe Obj errata nel codice che si desidera controllare prima.