2012-12-19 1 views
8

Ho due progetti, un progetto scala e un progetto java. Il mio progetto scala fa riferimento al progetto java nel percorso di generazione. Nel mio progetto Java, sto dichiarando la seguente annotazione:Come far funzionare le annotazioni del metodo java in scala

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MyAnnotation { 
    public String Name(); 
} 

Nel mio progetto Scala, che sto annotando alcuni metodi. Cioè

class MyClass { 
    ... 
    @MyAnnotation(Name="Blah") 
    def myMethod() { 
     ... 
    } 
} 

In un altro file da qualche parte, sto cercando di estrarre le annotazioni.

var methods = myClassInstance.getClass().getDeclaredMethods() 
var myMethod : Method = null 
for (method <- methods) { 
    if (method.getName().equals("myMethod")) { 
    myMethod = method 
    } 
} 
var annotations = myMethod.getDeclaredAnnotations() 

Sfortunatamente, annotations è sempre un array vuoto. Sto facendo qualcosa di fondamentalmente sbagliato o sto semplicemente perdendo qualcosa di secondario? Grazie!

EDIT Originariamente, ero annotare myMethod con myAnnotation due volte, che non è corretto come qualcuno ha sottolineato. Si scopre che questo non era il problema. Sto ancora ottenendo un array vuoto per annotations. Nessuna eccezione viene lanciata.

risposta

7

ho provato il codice, il problema è che l'utilizzo @MyAnnotation due volte per myMethod, che dovrebbe aumentare AnnotationFormatError: Duplicare l'annotazione per la classe

quando cambio da utilizzare una volta, il riflesso solo recupera i annotions.

+0

Grazie per averlo indicato. Sfortunatamente non era questo il problema. Anche con un'annotazione, sto ancora ricevendo un array vuoto. Nessuna eccezione viene lanciata – Jordan

+0

Come hai fatto a far funzionare questo? Puoi pubblicare un esempio? Grazie! – Jordan

+0

Come ho detto, io uso solo il codice postato. Il tuo codice postato genera eccezioni (prima versione) e ha errori di compilazione (seconda versione, dovresti definire il tipo per la riga 'var myMethod = null'), dopo che li ho risolti, funziona. E la mia versione di scala è 2.9.3 –