2012-11-10 7 views
11

Ho creato la mia annotazione, che utilizzo tramite riflessione per prendere una decisione nel mio codice. L'annotazione ha un valore predefinito impostato per il suo unico elemento. C'è un modo per accedere al valore predefinito tramite riflessione?Ottieni il valore dell'elemento predefinito dall'annotazione in Java

PageableRequestMapping.java (Annotazione)

package org.tothought.controllers.annotations; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface PageableRequestMapping { 
    String variablePath() default "/"; 
} 

Psuedo codice per recuperare Valore predefinito

private int parsePageNumber(StringBuffer requestURL, 
     PageableRequestMapping pageableRequestMapping) { 

     String variablePath = pageableRequestMapping.variablePath(); 

    //Psuedo code doesn't work in Java, included to illustrate intentions 
     if(variablePath.equalsIgnoreCase(pageableRequestMapping.variablePath().default())){ 
      //handle default case  
     }else{ 
      //handle different case 
     } 
     return 0; 
} 

La mia ricerca del problema si è presentato nessun esempio. Ho teorizzato che si potesse accedere a questo valore in modo statico attraverso la classe, ma non è possibile. Quindi mi rimangono due domande.

  • È possibile ottenere il valore predefinito di un elemento all'interno di un'annotazione?
  • Se sì, come?

Inoltre, so che potrei codificare questo valore, tuttavia vorrei rendere il programma leggermente più robusto.

risposta

13

È possibile utilizzare la reflection per ottenere l'oggetto metodo, e quindi utilizzare Method#getDefaultValue().

Method method = pageableReqMapping.annotationType().getMethod("variablePath"); 
String variablePath = (String) method.getDefaultValue(); 

Ecco un esempio concreto:

public class AnnotationTest { 

    public static void main(String[] args) throws Exception { 
    Class<?> clazz = Annotation.class; 
    Method method = clazz.getDeclaredMethod("value"); 
    String value = (String) method.getDefaultValue(); 
    System.out.println(value); 
    } 

    public @interface Annotation { 
    String value() default "default value"; 
    } 
} 
+0

La soluzione restituisce null; Sto controllando per assicurarsi che non sia io. Questo codice è stato eseguito? –

+0

Ho scritto un programma di test, che funziona correttamente: http://pastie.org/5356931 – Vulcan

+1

L'ho appena capito e il tuo incolla lo ha confermato. Devi ottenere la classe in modo statico. Invece di 'pageableRequestMapping.getClass' devi usare' PageableRequestMapping.class'. Mi chiedo perché ottenere la classe dall'istanza sia diverso dall'accesso statico alla classe. Grazie per l'ottima risposta, lo apprezzo. –

1

si può fare in questo modo, applicando l'annotazione su una classe e il recupero dalla classe attraverso la riflessione:

@PageableRequestMapping 
class MyUtilClass{ 
} 


public String getDefaultValue(){ 
    PageableRequestMapping pageableRequestMapping = MyUtilClass.class.getAnnotation(PageableRequestMapping.class); 
    return pageableRequestMapping.variablePath(); 
} 
+0

OP sta chiedendo come recuperare il valore predefinito l'annotazione, che è '/', 'non test'. – Vulcan

+0

Lo so, questo è un approccio che sto dicendo tutto, e funziona così non c'è assolutamente bisogno di annotarlo. –

+0

L'ho downsato perché non funzionava correttamente, prima di averlo modificato. Sebbene funzioni ora, non è troppo robusto. OP ha detto che poteva memorizzare il valore in una costante (come 'MAPPING_DEFAULT'), e semplicemente accedere a quel valore. La tua soluzione richiede indiscutibilmente più ingombro indesiderabile di quanto sarebbe una costante. – Vulcan

Problemi correlati